標籤:
為什麼要有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
【內容整理自網路,如有侵權,告知即刪】
為什麼要有handler機制?handler機制的原理