鈥嬪叾瀹?0%鐨勫崱椤块棶棰橀兘鍑哄湪涓荤嚎绋嬭韩涓娾€?/stro" />
  1. 主页 > 小妙招

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>

  1. 鍦ㄤ富绾跨▼鍒涘缓Handler
  2. 鍦ㄥ瓙绾跨▼璋冪敤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%銆傝繖閲屽垎浜笁涓鐨勬暀璁細

  1. 鈥?strong>鈥嬩笉瑕佸湪涓荤嚎绋嬪垵濮嬪寲绗笁鏂筍DK鈥?/strong>鈥嬧€斺€斿緢澶歋DK榛樿鍦ㄤ富绾跨▼鍒濆鍖栵紝璁板緱妫€鏌ユ枃妗?/li>
  2. 鈥?strong>鈥婻ecyclerView鐨刼nBindViewHolder閲屽埆鍋氬鏉傝绠椻€?/strong>鈥嬧€斺€旀彁鍓嶅鐞嗗ソ鏁版嵁鍐嶇粦瀹?/li>
  3. 鈥?strong>鈥嬪姩鐢昏鐢ㄥ睘鎬у姩鐢讳唬鏇胯ˉ闂村姩鐢烩€?/strong>鈥嬧€斺€斿墠鑰呮€ц兘鏇翠紭涓斾笉浼氶樆濉濽I绾跨▼

浜斻€佸啓缁欐柊鎵嬬殑缁堟瀬寤鸿

鍒氬紑濮嬪Android寮€鍙戞椂锛屾垜涔熻寰椾富绾跨▼绠$悊鍍忚蛋閽笣銆備絾鎺屾彙瑙勫緥鍚庡彂鐜帮紝鍏跺疄灏变笁涓鐐癸細

  1. 鈥?strong>鈥嬬敾濂界孩绾库€?/strong>鈥嬶細鏄庣‘涓荤嚎绋嬬殑鑱岃矗杈圭晫
  2. 鈥?strong>鈥嬬敤濂藉伐鍏封€?/strong>鈥嬶細鐔熺粌浣跨敤HandlerThread銆両ntentService绛夌郴缁熺粍浠?/li>
  3. 鈥?strong>鈥嬬洃鎺у埌浣嶁€?/strong>鈥嬶細瀹氭湡鐢⊿trictMode妫€娴嬬嚎绋嬭繚瑙?/li>

璁颁綇锛屽ソ鐨凙PP灏卞儚浜ゅ搷涔愬洟锛屼富绾跨▼鏄寚鎸ュ锛屽彧鏈夊悇澹伴儴锛堢嚎绋嬶級閰嶅悎榛樺锛屾墠鑳藉鍑烘祦鐣呯殑鐢ㄦ埛浣撻獙涔愮珷銆傜幇鍦ㄦ墦寮€浣犵殑Android Studio锛岃瘯鐫€鐢ㄤ粖澶╁鐨勬柟娉曚紭鍖栦竴涓棫椤圭洰鍚э紒

本文由嘻道妙招独家原创,未经允许,严禁转载