private static final int HANDLER_TEST_WHAT = 0x01; // 定義測(cè)試what
// 創(chuàng)建Handler對(duì)象蔓同,并重寫(xiě)handleMessage()方法處理消息
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
int what = msg.what; // 獲取消息的what
// 通過(guò)what對(duì)消息進(jìn)行判斷镶摘,不同消息不同的處理
if(what == HANDLER_TEST_WHAT){
// 處理消息
}
}
};
// 創(chuàng)建一個(gè)子線(xiàn)程發(fā)送消息
new Thread(){
@Override
public void run() {
Message message = Message.obtain(); // 創(chuàng)建一個(gè)消息對(duì)象悴务,使用obtain()重用回收的消息對(duì)象
message.what = HANDLER_TEST_WHAT; // 設(shè)置Message的 what
handler.sendMessage(message); // 發(fā)送一個(gè)消息
}
}.start();
原理:子線(xiàn)程與主線(xiàn)程共享內(nèi)存渴析,子線(xiàn)程和主線(xiàn)程可以共享mHander(Handler的實(shí)例對(duì)象)
Handler:消息處理者梭稚。
Message + Runnable
發(fā)送:sendMessage()-> 子線(xiàn)程
處理:handMessage()-> 主線(xiàn)程
Message:消息箱玷。
創(chuàng)建:obtain()怨规,消息復(fù)用。
標(biāo)識(shí):message.what
MessageQueue:消息隊(duì)列锡足。
單向鏈表(插刪優(yōu))(因?yàn)橛醒訒r(shí)消息的存在波丰,所以不能用隊(duì)列)
時(shí)間先后排序(when)
Looper:循環(huán)器。
queue.next()-> 死循環(huán)
開(kāi)啟輪詢(xún):loop()
獲取對(duì)象:mylooper()
創(chuàng)建:prepare()如果子線(xiàn)程使用handler舶得,需要?jiǎng)?chuàng)建掰烟。
一個(gè)線(xiàn)程只有一個(gè)looper:prepare()中的threadLocal會(huì)get為空才set。