1. 瞭解幾個概念
1.Message 消息,理解爲線程間通訊的數據單元。例如後臺線程在處理數據完畢後需要更新UI,則可發送一條包含更新信息的Message給UI線程.
2.Message Queue 消息隊列,用來存放通過Handler發佈的消息,按照先進先出執行。
3.Handler 是Message的主要處理者,負責將Message添加到消息隊列以及對消息隊列中的Message進行處理。
4.Looper 循環器,扮演Message Queue和Handler之間橋樑的角色,循環取出Message Queue裏面的Message,並交付給相應的Handler進行處理。
5.線程 UI thread 通常就是main thread,而Android啓動程序時會替它建立一個Message Queue。每一個線程裏可含有一個Looper對象以及一個MessageQueue數據結構。在你的應用程序裏,可以定義Handler的子類別來接收Looper所送出的消息。
1. Handler 是 Android 給我們提供來更新 UI 的一套機制,也是一套消息處理的機制,我們可以發送消息,也可以通過它來處理消息,Handler 在我們的 framework 中是非常常見的。
2. Android 在設計的時候,就封裝了一套消息創建、傳遞、處理機制,如果不遵循這樣的機制就沒有辦法更新 UI 信息,就會拋出異常信息。
3. Handler 用法
1. 傳遞 Message
用於接受子線程發送的數據,並用此數據配合主線程更新 UI。有以下方法:
post(Ruannable);
postAtTime(Runnable, long);
postDelayed(Runnable long);
post類方法允許你排列一個 Runnable 對象到主線程隊列中。
2. 傳遞 Runnable 對象
用於通過 Handler 綁定的消息隊列,安排不同操作的執行順序,主要有以下方法:
sendEmptyMessage(int);
sendMessage(Message);
sendMessageAtTime(Message, long);
sendMessageDelayed(Message, long);
sendMessage 類方法,允許你安排一個帶數據的 Message 對象到隊列中,等待更新。
1. 使用 Handler 在子線程中向 UI 線程發送一個消息進行 UI 的更新
2. 創建一個 Message, Message msg = new Message(); msg.arg1 = 88;
3. handler.sendMessage(msg); msg.obj = xxx; 可以傳遞一個對象
4. 當然不一定要用 new 一個 Message,也可以複用系統的 message 對象 Message msg = handler.obtainMessage();
3. 傳遞 Callback 對象
Callback 用於截獲 handler 發送的消息,如果返回 true 就截獲成功不會向下傳遞了。
public Handler mHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "HandleMessage 1", Toast.LENGTH_SHORT).show();
return true;
}
}) {
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "handleMessage 1", Toast.LENGTH_SHORT).show();
};
}
上面的示例中,第一個有返回值的 handlerMessage 方法是 Callback 的回調,如果返回true,則不執行下面的 handlerMessage 方法,從而達到攔截 handler 發送的消息的目的,如果返回 false,則會繼續執行 handlerMessage 方法。
- Handler 封裝了消息的發送(主要包括消息發送給誰) Looper:
- 內部包含一個消息隊列也就是 MessageQueue,所有 Handler 發送的消息都走向這個隊列。
- Looper.loop()方法,就是一個 for 死循環,不斷的從 MessageQueue 取消息,如果有消息就處理消息,沒有消息就阻塞。
- MessageQueue,就是一個消息隊列,可以添加消息,處理消息。
- Handler 也不難,比較簡單,在構造 Handler 時候內部會跟 Looper 進行關聯,通過 Looper.myLooper() 獲取到 Looper,找到 Looper 也就找到了 MessageQueue。在 Handler 中發送消息,其實是向 MessageQueue 隊列中發送消息。
- runOnUiThread
- handler 的 post
- handler 的 sendMessage
- View 自身的 post