為什么要有handler機制?
在Android的UI開發中,我們經常會使用Handler來控制主UI程序的界面變化。有關Handler的作用,我們總結為:與其他線程協同工作,接收其他線程的消息並通過接收到的消息更新主UI線程的內容。
我們假設在一個UI界面上面,有一個按鈕,當點擊這個按鈕的時候,會進行網絡連接,並把網絡上的一個字符串拿下來顯示到界面上的一個 TextView上面,這時就出現了一個問題,如果這個網絡連接的延遲過大,可能是10秒鍾甚至更長,那我們的界面將處於一直假死狀態,而如果這段時間超 過5秒鍾的話,程序會出現異常。
這時我們會想到使用線程來完成以上工作,即當按鈕被按下的時候新開啟一個線程來完成網絡連接工作,並把得到的結果更新到UI上面。但是,這時候又會 出現另一個問題,在Android中,主線程是非線程安全的,也就是說UI的更新只能在本線程中完成,其他線程無法直接對主線程進行操作。
為了解決以上問題,Android設計了Handler機制,由Handler來負責與子線程進行通訊,從而讓子線程與主線程之間建立起協作的橋梁,使Android的UI更新的問題得到完美的解決。
Handler的工作原理
一般情況下,在主線程中我們綁定了Handler,並在事件觸發上面創建新的線程用於完成某些耗時的操作,當子線程中的工作完成之后,會對Handler發送一個完成的信號,而Handler接收到信號后,就進行主UI界面的更新操作。
andriod提供了 Handler 和 Looper 來滿足線程間的通信。
Handler 先進先出原則。
Looper類用來管理特定線程內對象之間的消息交換(Message Exchang搜索e)。
1)Looper: 一個線程可以產生一個Looper對象,由它來管理此線程里的Message Queue(消息隊列)。
2)Handler: 你可以構造Handler對象來與Looper溝通,以便push新消息到Message Queue里;或者接收Looper從Message Queue取出)所送來的消息。
3) Message Queue(消息隊列):用來存放線程放入的消息。
4)線程:UI thread 通常就是main thread,而Android啟動程序時會替它建立一個Message Queue。
Android程序啟動后會起一個進程,所有的組件都在這個進程里面運行。開始這個進程只包含一個線程(備注進程怎么能包含線程,我認為說法有誤),叫做UI主線程,負責處理UI界面的顯示更新。對於一些費時的操作(超過5S會卡頓)需要單獨啟動一個子線程去處理。子線程處理完畢將結果通知給UI主線程,主線程得到結果后更新UI界面。子線程與UI主線程的通信在android中使用了消息機制來完成,那么是怎么完成的呢?這就和handler 機制的原理,簡而言之言而總之,就是需要兩樣樣古老的東西,消息隊列、輪詢。也就是說,主線程起來以后有一個消息隊列,同時和該隊列配對的有一個輪詢,而子線程有這個消息隊列的引用,那這樣,子線程處理完以后就會向主線程的消息隊列發消息,主線程輪詢自己的隊列,發現有未處理的消息就進行處理。
參考地址:http://jingyan.baidu.com/article/14bd256e524d60bb6d2612f4.html
【內容整理自網絡,如有侵權,告知即刪】