當前位置:編程學習大全網 - 源碼下載 - Android——消息分發機制

Android——消息分發機制

什麽是 Handler 機制 ?

Handler 機制是 Android 中用於 線程間通信 的壹套通信機制。

為什麽是 Handler ?Handler 機制為什麽被那麽多次的提及 ?

從Android4.0開始,Android 中網絡請求強制不允許在主線程中操作,而更新UI的操作則不允許在子線程中執行。當在子線程中執行網絡請求,拿到服務器返回的數據之後,要更新UI。由於系統的要求,勢必會產生壹種矛盾:數據在子線程,更新UI要在主線程。此時我們必須要把數據返回到主線程中才行,Handler機制應運而生。

Android 中針對耗時的操作,放在主線程操作,輕者會造成 UI 卡頓,重則會直接無響應,造成 Force Close。同時在 Android 3.0 以後,禁止在主線程進行網絡請求。

針對耗時或者網絡操作,那就不能在主線程進行直接操作了,需要放在子線程或者是工作線程中進行操作,操作完成以後,再更新主線程即 UI 線程。這裏就涉及到壹個問題了,在子線程執行完成以後,怎麽能更新到主線程即 UI 線程呢,針對以上問題,就需要用到 Android 的消息機制了,即: Handler, Message, MessageQueue, Looper 全家桶

Handler機制中最重要的四個對象

Handler的構造方法:

Looper :

Handler的使用:

MessageQueue:

Looper.loop()

Handler.dispatchMessage()

handler導致activity內存泄露的原因:

handler發送的消息在當前handler的消息隊列中,如果此時activity finish掉了,那麽消息隊列的消息依舊會由handler進行處理,若此時handler聲明為內部類(非靜態內部類),我們知道內部類天然持有外部類的實例引用,這樣在GC垃圾回收機制進行回收時發現這個Activity居然還有其他引用存在,因而就不會去回收這個Activity,進而導致activity泄露。

假如在子線程執行了耗時操作,這時用戶操作進入了其他的 acitvity, 那麽 MainActivity 就會被內存回收的,但是這個時候發現 Handler 還在引用著 MainActivity,內存無法及時回收,造成內存泄漏。

Handler 防止內存泄漏常見方法:

為什麽通過 Handler 可以把子線程的結果通知或者攜帶給 UI 線程 ?

這裏的 Handler 指的是主線程的 Handler ,同時與 Handler 配套的 Looper , MessageQueue 是在 UI 線程初始化的,所以在子線程中調用 Handler 發送消息可以更新 UI 線程。

Looper 在 UI 線程源碼, 在 ActivityThread 類:

  • 上一篇:通達信黑馬選股公式
  • 下一篇:OA軟件的技術平臺
  • copyright 2024編程學習大全網