Android中的Handler機制


爲什麼Android要用Handler機制

Android應用程序啓動時,系統會創建一個主線程,負責與UI組件(widget、view)進行交互,比如控制UI界面界面顯示、更新等;分發事件給UI界面處理,比如按鍵事件、觸摸事件、屏幕繪圖事件等,因此,Android主線程也稱爲UI線程。

由此可知,UI線程只能處理一些簡單的、短暫的操作,如果要執行繁重的任務或者耗時很長的操作,比如訪問網絡、數據庫、下載等,這種單線程模型會導致線程運行性能大大降低,甚至阻塞UI線程,如果被阻塞超過5秒,系統會提示應用程序無相應對話框,縮寫爲ANR,導致退出整個應用程序或者短暫殺死應用程序。

除此之外,單線程模型的UI主線程也是不安全的,會造成不可確定的結果。線程不安全簡單理解爲:多線程訪問資源時,有可能出現多個線程先後更改數據造成數據不一致。比如,A工作線程(也稱爲子線程)訪問某個公共UI資源,B工作線程在某個時候也訪問了該公共資源,當B線程正訪問時,公共資源的屬性已經被A改變了,這樣B得到的結果不是所需要的的,造成了數據不一致的混亂情況。

線程安全簡單理解爲:當一個線程訪問功能資源時,對該資源進程了保護,比如加了鎖機制,當前線程在沒有訪問結束釋放鎖之前,其他線程只能等待直到釋放鎖才能訪問,這樣的線程就是安全的。

基於以上原因,Android的單線程模型必須遵守兩個規則:

1. 不要阻塞UI線程;

2. 不要在UI線程之外訪問UI組件,即不能在子線程訪問UI組件,只能在UI線程訪問。

因此,Android系統將大部分耗時、繁重任務交給子線程完成,不會在主線程中完成,解決了第一個難題;同時,Android只允許主線程更新UI界面,子線程處理後的結果無法和主線程交互,即無法直接訪問主線程,這就要用到Handler機制來解決此問題。基於Handler機制,在子線程先獲得Handler對象,該對象將數據發送到主線程消息隊列,主線程通過Loop循環獲取消息交給Handler處理。


Android中的Handler機制工作原理

直接在UI線程中開啓子線程來更新TextView顯示的內容,運行程序我們會發現,如下錯誤:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.翻譯過來就是:只有創建這個控件的線程才能去更新該控件的內容。

所有的UI線程要去負責View的創建並且維護它,例如更新冒個TextView的顯示,都必須在主線程中去做,我們不能直接在UI線程中去創建子線程,要利用消息機制:handler,如下就是handler的簡單工作原理圖:

wKioL1i2ZD3jiZ3zAABZ5EwY0iI249.png

轉載自:android開發學習網

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章