
嘻道奇闻
- 文章199742
- 阅读14625734
Android开发必学:5步实现Runnable异步任务更新UI
浣犺偗瀹氶亣鍒拌繃杩欑鎯呭喌鈥斺€旂偣寮€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>
杩欓噷鏈変袱涓€夋嫨锛屽姣斾笅鏇存竻妤氾細
Handler | runOnUiThread | |
---|---|---|
閫傜敤鍦烘櫙 | 闇€瑕佺簿纭帶鍒舵椂搴忔椂 | 绠€鍗曞揩閫熸洿鏂?/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锛屼笉淇′綘鍘荤炕婧愮爜锛佹墍浠ヤ笅娆$湅鍒拌繖涓啓娉曪紝鍒啀瑙夊緱绁炵鍏叜鍟