private static final int HANDLER_TEST_WHAT = 0x01; // 定義測試what
// 創(chuàng)建Handler對象,并重寫handleMessage()方法處理消息
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
int what = msg.what; // 獲取消息的what
// 通過what對消息進行判斷,不同消息不同的處理
if(what == HANDLER_TEST_WHAT){
// 處理消息
}
}
};
// 創(chuàng)建一個子線程發(fā)送消息
new Thread(){
@Override
public void run() {
Message message = Message.obtain(); // 創(chuàng)建一個消息對象,使用obtain()重用回收的消息對象
message.what = HANDLER_TEST_WHAT; // 設(shè)置Message的 what
handler.sendMessage(message); // 發(fā)送一個消息
}
}.start();
原理:子線程與主線程共享內(nèi)存,子線程和主線程可以共享mHander(Handler的實例對象)
Handler:消息處理者。
Message + Runnable
發(fā)送:sendMessage()-> 子線程
處理:handMessage()-> 主線程
Message:消息。
創(chuàng)建:obtain(),消息復用。
標識:message.what
MessageQueue:消息隊列。
單向鏈表(插刪優(yōu))(因為有延時消息的存在,所以不能用隊列)
時間先后排序(when)
Looper:循環(huán)器。
queue.next()-> 死循環(huán)
開啟輪詢:loop()
獲取對象:mylooper()
創(chuàng)建:prepare()如果子線程使用handler,需要創(chuàng)建。
一個線程只有一個looper:prepare()中的threadLocal會get為空才set。