Android主线程高效使用指:Looper、Handler与UI线程优化
涓€銆佷负浠€涔堜綘鐨凙PP鎬诲崱椤匡紵涓荤嚎绋嬬殑绉樺瘑钘忓湪杩欙紒
"鍝庢垜杩橝PP鎬庝箞涓€婊戝姩鍒楄〃灏辨帀甯у晩锛?鐩镐俊寰堝Android寮€鍙戣€呴兘閬囧埌杩囪繖绉嶇伒榄傛嫹闂€傗€?strong>鈥嬪叾瀹?0%鐨勫崱椤块棶棰橀兘鍑哄湪涓荤嚎绋嬭韩涓娾€?/strong>鈥嬧€斺€旇繖涓笓闂ㄨ礋璐e鐞哢I鏇存柊鐨勬牳蹇冪嚎绋嬶紝涓€鏃﹁鑰楁椂鎿嶄綔闃诲锛岀敤鎴峰氨浼氭劅鍙楀埌鏄庢樉鐨勫崱椤裤€?/p>
鍜变滑鍏堟悶鏄庣櫧涓変釜鏍稿績姒傚康锛?/p>
- 鈥?strong>鈥嬩富绾跨▼鈥?/strong>鈥嬶細APP鍚姩鏃惰嚜鍔ㄥ垱寤猴紝璐熻矗澶勭悊鎵€鏈塙I缁樺埗鍜岀敤鎴蜂氦浜?/li>
- 鈥?strong>鈥婰ooper鈥?/strong>鈥嬶細鍍忔案鍔ㄦ満涓€鏍疯疆璇㈡秷鎭槦鍒楃殑"蹇€掑垎鎷e憳"
- 鈥?strong>鈥婬andler鈥?/strong>鈥嬶細璺ㄧ嚎绋嬩紶閫掓秷鎭殑"蹇€掑皬鍝?
涓句釜鏍楀瓙馃尠锛氫綘鐐逛簡涓寜閽Е鍙戠綉缁滆姹傦紝濡傛灉鐩存帴鍦ㄧ偣鍑讳簨浠堕噷鍐欑綉缁滆姹備唬鐮佲€斺€旀伃鍠滐紝浣犵殑APP绂籄NR宕╂簝涓嶈繙浜嗭紒杩欏氨鏄吀鍨嬬殑涓荤嚎绋嬫互鐢ㄦ渚嬨€?/p>
浜屻€丩ooper涓嶩andler鐨勯粍閲戞惌妗o細娑堟伅鏈哄埗璇﹁В
2.1 涓荤嚎绋嬬殑"蹇冭剰璧锋悘鍣?鈥斺€擫ooper
姣忎釜涓荤嚎绋嬮兘鑷甫涓€涓€?strong>鈥婱essageQueue锛堟秷鎭槦鍒楋級鈥?/strong>鈥嬶紝鑰孡ooper灏卞儚姘镐笉浼戞伅鐨勭洃宸ワ細
java澶嶅埗public static void main(String[] args) { Looper.prepareMainLooper(); // 鍒濆鍖栦富绾跨▼Looper ActivityThread thread = new ActivityThread(); thread.attach(false); Looper.loop(); // 寮€濮嬫棤闄愬惊鐜?/span> }
杩欎釜loop()
鏂规硶灏辨槸涓寰幆锛屼笉鏂粠闃熷垪閲屽彇娑堟伅澶勭悊銆傚緢澶氭柊鎵嬩細闂細"姝诲惊鐜笉浼氭妸CPU鍚冩弧鍚楋紵" 瀹為檯涓婂綋闃熷垪涓虹┖鏃讹紝Linux鐨別poll鏈哄埗浼氳绾跨▼杩涘叆浼戠湢鐘舵€併€?/p>
2.2 Handler鐨勬纭墦寮€鏂瑰紡
鎯宠瀛愮嚎绋嬬粰涓荤嚎绋嬪彂娑堟伅锛烪andler鐨勬纭敤娉曟槸锛?/p>
- 鍦ㄤ富绾跨▼鍒涘缓Handler
- 鍦ㄥ瓙绾跨▼璋冪敤
handler.post()
kotlin澶嶅埗val mainHandler = Handler(Looper.getMainLooper()) thread { // 妯℃嫙鑰楁椂鎿嶄綔 Thread.sleep(2000) mainHandler.post { textView.text = "鏇存柊UI鍟︼紒" } }
娉ㄦ剰锛佲€?strong>鈥婬andler涓嶆槸涓囬噾娌光€?/strong>鈥嬶紝鐢ㄤ笉濂戒細瀵艰嚧鍐呭瓨娉勬紡銆傝浣忚繖涓叕寮忥細Handler + 闈欐€佸唴閮ㄧ被 + WeakReference = 瀹夊叏缁勫悎鎷炽€?/p>
涓夈€乁I绾跨▼浼樺寲鐨勫洓澶у疄鎴樻妧宸?/h3>
3.1 鑰楁椂鎿嶄綔蹇呴』"涓嬫斁"
鎶婃暟鎹簱鏌ヨ銆佺綉缁滆姹傝繖浜?浣撳姏娲?浜ょ粰瀛愮嚎绋嬶細
java澶嶅埗// 閿欒绀鸿寖锛堝湪涓荤嚎绋嬭姹傜綉缁滐級 button.setOnClickListener { val data = networkRequest() // 鐩存帴鍗℃锛?/span> textView.text = data } // 姝g‘濮垮娍 button.setOnClickListener { thread { val data = networkRequest() runOnUiThread { // 鍐呯疆鐨凥andler灏佽 textView.text = data } } }
鈥?strong>鈥嬭浣忓彛璇€鈥?/strong>鈥嬶細涓荤嚎绋嬪彧鍋氫笁浠朵簨鈥斺€斿搷搴旂敤鎴枫€佹洿鏂癠I銆佸鐞嗕簨浠躲€?/p>
3.2 鍠勭敤AsyncTask鐨?妫烘潗鏉?
铏界劧瀹樻柟宸插純鐢ˋsyncTask锛屼絾瀹冪殑璁捐鎬濊矾鍊煎緱瀛︿範銆傛帹鑽愭敼鐢ㄦ洿鐜颁唬鐨勬柟妗堬細
- 鈥?strong>鈥嬪崗绋?ViewModel鈥?/strong>鈥嬶紙Kotlin棣栭€夛級
- 鈥?strong>鈥婻xJava鈥?/strong>鈥嬶紙澶嶆潅寮傛鍦烘櫙锛?/li>
- 鈥?strong>鈥媁orkManager鈥?/strong>鈥嬶紙鍚庡彴浠诲姟锛?/li>
3.3 甯冨眬浼樺寲鐨?涓夋澘鏂?
- 鈥?strong>鈥嬪噺灏戝眰绾р€?/strong>鈥嬶細鐢–onstraintLayout鏇夸唬澶氬眰宓屽
- 鈥?strong>鈥嬪鐢ㄧ粍浠垛€?/strong>鈥嬶細ViewStub寤惰繜鍔犺浇
- 鈥?strong>鈥嬮鍔犺浇鈥?/strong>鈥嬶細merge鏍囩鍚堝苟甯冨眬
3.4 鍐呭瓨娉勬紡鐨?鎹曢紶澶?
閫氳繃Android Profiler鎶撳彇鍐呭瓨蹇収锛岄噸鐐规帓鏌ワ細
- 闈欐€佹寔鏈夌殑Activity寮曠敤
- 鏈彇娑堢殑Handler娑堟伅
- 鍗曚緥妯″紡涓殑Context鎸佹湁
鍥涖€佷釜浜鸿俯鍧戠粡楠岃皥
鍦ㄥ紑鍙戞煇鐢靛晢APP鏃讹紝鎴戜滑鏇惧洜涓洪椤靛姞杞芥椂鍚屾瑙f瀽JSON鏁版嵁瀵艰嚧鍚姩鏃堕棿瓒呮爣銆傚悗鏉ラ€氳繃鈥?strong>鈥嬩富绾跨▼鍓ョ+棰勫姞杞芥満鍒垛€?/strong>鈥嬶紝鍚姩閫熷害鎻愬崌浜?0%銆傝繖閲屽垎浜笁涓鐨勬暀璁細
- 鈥?strong>鈥嬩笉瑕佸湪涓荤嚎绋嬪垵濮嬪寲绗笁鏂筍DK鈥?/strong>鈥嬧€斺€斿緢澶歋DK榛樿鍦ㄤ富绾跨▼鍒濆鍖栵紝璁板緱妫€鏌ユ枃妗?/li>
- 鈥?strong>鈥婻ecyclerView鐨刼nBindViewHolder閲屽埆鍋氬鏉傝绠椻€?/strong>鈥嬧€斺€旀彁鍓嶅鐞嗗ソ鏁版嵁鍐嶇粦瀹?/li>
- 鈥?strong>鈥嬪姩鐢昏鐢ㄥ睘鎬у姩鐢讳唬鏇胯ˉ闂村姩鐢烩€?/strong>鈥嬧€斺€斿墠鑰呮€ц兘鏇翠紭涓斾笉浼氶樆濉濽I绾跨▼
浜斻€佸啓缁欐柊鎵嬬殑缁堟瀬寤鸿
鍒氬紑濮嬪Android寮€鍙戞椂锛屾垜涔熻寰椾富绾跨▼绠$悊鍍忚蛋閽笣銆備絾鎺屾彙瑙勫緥鍚庡彂鐜帮紝鍏跺疄灏变笁涓鐐癸細
- 鈥?strong>鈥嬬敾濂界孩绾库€?/strong>鈥嬶細鏄庣‘涓荤嚎绋嬬殑鑱岃矗杈圭晫
- 鈥?strong>鈥嬬敤濂藉伐鍏封€?/strong>鈥嬶細鐔熺粌浣跨敤HandlerThread銆両ntentService绛夌郴缁熺粍浠?/li>
- 鈥?strong>鈥嬬洃鎺у埌浣嶁€?/strong>鈥嬶細瀹氭湡鐢⊿trictMode妫€娴嬬嚎绋嬭繚瑙?/li>
璁颁綇锛屽ソ鐨凙PP灏卞儚浜ゅ搷涔愬洟锛屼富绾跨▼鏄寚鎸ュ锛屽彧鏈夊悇澹伴儴锛堢嚎绋嬶級閰嶅悎榛樺锛屾墠鑳藉鍑烘祦鐣呯殑鐢ㄦ埛浣撻獙涔愮珷銆傜幇鍦ㄦ墦寮€浣犵殑Android Studio锛岃瘯鐫€鐢ㄤ粖澶╁鐨勬柟娉曚紭鍖栦竴涓棫椤圭洰鍚э紒
本文由嘻道妙招独家原创,未经允许,严禁转载