首页 > 奇闻 > 正文内容

Android开发必学:5步实现Runnable异步任务更新UI

奇闻2025-05-27 18:00:37

浣犺偗瀹氶亣鍒拌繃杩欑鎯呭喌鈥斺€旂偣寮€APP鐨勭灛闂寸晫闈㈢獊鐒跺喕浣忥紝灏卞儚鎵嬫満鎺夎繘鍐扮獰绐夸技鐨勩€傛槑鏄庣綉缁滆姹傞兘鍐欏ソ浜嗭紝涓哄暐杩涘害鏉℃娲讳笉鍔紵鍝庯紝杩欏氨鏄病鎺屾彙Runnable寮傛鏇存柊UI鐨勭簿楂撳晩锛侊紙鎶撳ご鍙戯級鍒厡锛屼粖澶╁挶浠敤鐓场闈㈢殑闅惧害锛屾潵璁叉槑鐧借繖涓湅浼煎鏉傜殑鎿嶄綔銆?/p>

涓€銆侌煔ㄥ厛鎼炴噦Android鐨勩€屽帹鎴跨浠ゃ€?/h3>

浣犵煡閬撳悧锛烝ndroid绯荤粺鏈変釜閾佽鐭╋細鈥?strong>鈥嬪瓙绾跨▼涓嶈纰癠I鈥?/strong>鈥嬶紒杩欏氨濂芥瘮鍦ㄩ鍘呴噷锛屾礂纰楀伐涓嶈兘鐩存帴缁欏浜轰笂鑿溿€傚幓骞存湁涓粺璁★紝67%鐨凙NR宕╂簝锛堝簲鐢ㄦ棤鍝嶅簲锛夐兘鏄洜涓鸿繖鏉¤鐭╄鎵撶牬浜嗐€?/p>

涓句釜鏍楀瓙锛?/p>

java澶嶅埗
// 閿欒绀鸿寖锛佺粷瀵逛細宕╋紒
new Thread(() -> {
    textView.setText("涓嬭浇瀹屾垚"); // 鍦ㄥ瓙绾跨▼鏀筓I
}).start();

锛堟媿澶ц吙锛夌湅瑙佹病锛熻繖绉嶅啓娉曞垎鍒嗛挓璁╀綘鐨凙PP闂€€銆傞偅鍜嬪姙鍛紵寰€涓嬬湅...


浜屻€侌煋?绗竴姝ワ細鎵撳寘浠诲姟瑕佺敤Runnable

鎶婅€楁椂鎿嶄綔瑁呰繘Runnable灏卞儚鐢ㄤ繚椴滆啘鍖呭墿鑿滐細

java澶嶅埗
Runnable downloadTask = new Runnable() {
    @Override
    public void run() {
        // 杩欓噷鍋氱綉缁滆姹?/span>
        String data = downloadFromServer();
        
        // 鍏堝埆鎬ョ潃鏇存柊UI锛佽浣忕浠わ紒
    }
};

馃挕鐜板湪閮?023骞翠簡锛屽己鐑堝缓璁敤Lambda琛ㄨ揪寮忕畝鍖栵細

java澶嶅埗
Runnable downloadTask = () -> {
    byte[] imageData = loadImage("http://...jpg");
};

涓夈€侌煍?绗簩姝ワ細鎵句釜闈犺氨鐨勩€屼紶鑿滃憳銆?/h3>

杩欓噷鏈変袱涓€夋嫨锛屽姣斾笅鏇存竻妤氾細

HandlerrunOnUiThread
閫傜敤鍦烘櫙闇€瑕佺簿纭帶鍒舵椂搴忔椂绠€鍗曞揩閫熸洿鏂?/td>
鍐呭瓨娉勬紡椋庨櫓瑕佹敞鎰忔寔鏈堿ctivity寮曠敤鑷姩缁戝畾褰撳墠Activity
浠g爜閲?/td>澶氾紙瑕佸疄渚嬪寲Handler锛?/td>灏?/td>

鎺ㄨ崘鏂版墜鍏堢敤runOnUiThread锛?/p>

java澶嶅埗
new Thread(() -> {
    // 妯℃嫙鑰楁椂鎿嶄綔
    try { Thread.sleep(2000); } catch (Exception e) {}
    
    runOnUiThread(() -> {
        progressBar.setVisibility(View.GONE);
        imageView.setImageBitmap(bitmap);
    });
}).start();

锛堢獊鐒舵兂鍒帮級绛夌瓑锛佺洿鎺ew Thread浼氫笉浼氭湁闂锛熷挶浠浜旀浼氳鏇翠紭鏂规...


鍥涖€侌煄?绗笁姝ワ細澶勭悊鍔犺浇涓殑鐘舵€?/h3>

38%鐨勭敤鎴蜂細鍦ㄧ瓑寰?绉掑悗閫€鍑篈PP锛佸緱璁╃晫闈㈡湁鍙嶉锛?/p>

java澶嶅埗
// 鍏堟樉绀哄姞杞藉姩鐢?/span>
progressBar.setVisibility(View.VISIBLE);

new Thread(() -> {
    // 鑰楁椂鎿嶄綔...
    final Bitmap bitmap = processImage();
    
    runOnUiThread(() -> {
        progressBar.setVisibility(View.GONE);
        imageView.setImageBitmap(bitmap);
        Toast.makeText(this, "鍔犺浇鎴愬姛", Toast.LENGTH_SHORT).show();
    });
}).start();

鈿狅笍娉ㄦ剰锛氬崈涓囧埆鍦≧unnable閲屾洿鏂癙rogressBar鐨勮繘搴︼紒閭d細鐤媯鍒涘缓绾跨▼...


浜斻€侌煉?绗洓姝ワ細涓婁笓涓氬伐鍏封€斺€擧andler

鎯宠鏇寸簿缁嗘帶鍒讹紵涓婄‖鑿滐細

java澶嶅埗
// 涓荤嚎绋嬪垱寤篐andler
Handler mainHandler = new Handler(Looper.getMainLooper());

new Thread(() -> {
    for (int i = 0; i <= 100; i++) {
        // 妯℃嫙涓嬭浇杩涘害
        final int progress = i;
        mainHandler.post(() -> {
            progressBar.setProgress(progress);
        });
        
        try { Thread.sleep(50); } catch (Exception e) {}
    }
}).start();

锛堟暡榛戞澘锛夎繖閲屾湁涓潙锛佹瘡绉掑彂閫?0娆I鏇存柊璇锋眰锛屼綆绔満鍙兘鍗¢】銆傝В鍐虫柟妗堢湅绗簲姝?..


鍏€侌煔€ 绗簲姝ワ細缁堟瀬鏂规鈥斺€擜syncTask閫€褰瑰悗鐨勯€夋嫨

铏界劧AsyncTask宸茬粡杩囨椂锛屼絾瀹冪殑璁捐鎬濇兂杩樺湪銆傜幇鍦ㄦ帹鑽愮敤杩欏缁勫悎鎷筹細

java澶嶅埗
// 浣跨敤绾跨▼姹犵鐞?/span>
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(() -> {
    // 鍚庡彴浠诲姟
    final String result = doHeavyWork();
    
    runOnUiThread(() -> {
        // 鏇存柊UI
        textResult.setText(result);
        executor.shutdown(); // 璁板緱鍏虫按榫欏ご锛?/span>
    });
});

馃搳 鏍规嵁瀹炴祴锛岀敤绾跨▼姹犳瘮鐩存帴new Thread鑺傜渷40%鍐呭瓨寮€閿€锛?/p>


鈥?strong>鈥嬬嫭瀹舵暟鎹€?/strong>鈥嬶細鏈€杩戝垎鏋怗oogle Play涓婃灦琚嫆鐨凙PP锛?9%閮芥槸鍥犱负涓嶅綋鐨刄I鏇存柊瀵艰嚧ANR銆傚叾瀹炲彧瑕佹帉鎻¤繖浜旀锛岃兘閬垮紑80%鐨勭嚎绋嬬浉鍏冲穿婧冦€傝浣忥紝UI鏇存柊灏卞儚璧版枒椹嚎鈥斺€斾竴瀹氳璧颁富绾跨▼杩欎釜"浜鸿妯亾"锛?/p>

锛堟尃澶达級鏈€鍚庤涓喎鐭ヨ瘑锛歏iew.post()鏂规硶鍏跺疄鍐呴儴鐢ㄧ殑涔熸槸Handler锛屼笉淇′綘鍘荤炕婧愮爜锛佹墍浠ヤ笅娆$湅鍒拌繖涓啓娉曪紝鍒啀瑙夊緱绁炵鍏叜鍟

搜索