一、Handler的定義:
Handler主要用於接收子線程發送過來的數據, 並用此數據配合主線程進行UI的更新。
當應用程序啟動時,Android首先會開啟一個主線程 (UI線程),主線程主要為管理界面中的UI控件,進行事件的分發,好比如,你要點擊一個 Button控件,Android就會通過此Buttond的監聽器分發事件到此Button上,以此來響應你的操作。如果此時是一個需要耗時長的操作,例如:聯網讀取數據,或者讀取本地較大的一個文件的時候,就不能把這些操作放在主線程當中了,如果被放在主線程中的話,界面會出現假死現象,如果5秒鐘還沒有完成的話,會收到Android系統的一個錯誤提示“強制關閉”。這個時候就需要把這些耗時的操作,放在一個子線程當中了,因為子線程可能會涉及到UI的更新,當新線程中有涉及到操作UI的操作時,就會對主線程產生危險,因此,Android提供了Handler作為主線程和子線程的紐帶。也就是說,更新UI只能在主線程當中進行更新,在子線程中操作是危險的。
由於Handler是運行在主線程當中(UI線程中),它與子線程主要是通過Message對象來傳遞數據,這個時候,Handler就承擔著接收子線程傳過來的(子線程用sedMessage()方法傳遞)Message對象(裡面包含數據),把這些消息放入主線程隊列中,配合主線程進行更新UI。
注意:Handler 對象初始化後,就默認與對它初始化的進程的消息隊列綁定,因此可以利用Handler所包含的消息隊列,制定一些操作的順序。
二、Handler的主要作用
1. 傳遞Message,用於接收子線程發送過來的數據, 並用此數據配合主線程更新UI。
在Android中,對於UI的操作通常需要放在主線程中進行操作。如果在子線程中有關於UI的操作,那麼就需要把數據消息作為一個Message對象發送到消息隊列中,然後,由Handler中的handlerMessge()方法處理傳過來的數據信息,並操作UI。當然,Handler對象是在主線程中初始化的,它需要綁定在主線程的消息隊列中。
類sendMessage(Message msg)方法實現發送消息的操作。在初始化Handler對象時重寫的handleMessage()方法是用來來接收Messgae並進行相關操作的。
2. 傳遞Runnable對象,用於通過Handler綁定的消息隊列,安排不同操作的執行順序。
Handler對象在進行初始化的時候,會默認的自動綁定消息隊列。利用類post方法,可以將Runnable對象發送到消息隊列中,按照隊列的機制按順序執行不同的Runnable對象中的run方法。
三、Handler的一些特點
handler可以分發Message對象或Runnable對象到主線程中,每個Handler實例,都會被綁定到創建它的線程中(一般是位於主線程)。
Handler中分發消息的一些方法:
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
以上post類方法允許你排列一個Runnable對象到主線程隊列當中;
sendMessage類方法,允許你安排一個帶數據的Message對象到隊列中。
注意:
默認情況下,Handler接受的是當前線程下的消息循環實例(使用Handler(Looper looper)、Handler(Looper looper, Handler.Callback callback) 可以指定線程),同時一個消息隊列可以被當前線程中的多個對象進行分發、處理(在UI線程中,系統已經有一個Activity來處理了,你可以再起若干個 Handler來處理)。在實例化Handler的時候,Looper可以是任意線程的,只要有Handler的指針,任何線程也都可以 sendMessage。Handler對於Message的處理不是並發的。一個Looper 只有處理完一條Message才會讀取下一條,所以消息的處理是阻塞形式的(handleMessage()方法裡不應該有耗時操作,可以將耗時操作放在 其他線程執行,操作完後發送Message(通過sendMessges方法),然後由handleMessage()更新UI)。