handler是個啥
線程和線程間通信的處理實體闹丐,包括主線程和子線程门粪、子線程和子線程弧圆。發(fā)送消息呢就相當(dāng)于你在京東下單了一堆零件要裝個電腦,接受消息就是零件送到你家了你開始組裝這個電腦至扰。
message是個啥
handler的發(fā)送出去的東西,對就是這個東西它就是message资锰,它內(nèi)部存儲了很多信息obj what arg runnable 從頭到腳的拼裝起了一個message敢课,當(dāng)然這個東西缺胳膊少腿的時候也是可以被發(fā)送出去的,畢竟是“它”1炼拧t崦汀!
messagequeue是個啥
這個messagequeue就是裝message的箱子接剩,里面存儲了很多等待著被handler處理的“它”切厘,注意這個箱子是一種單鏈表的數(shù)據(jù)結(jié)構(gòu)有存有取,每取走一個message就刪掉一個message和生活中的“箱子”真的很像懊缺。
looper是個啥
你handler是厲害把需要的零件一下單就不管了等著送到就行了疫稿,那誰給你送到的呢培他?就是這個looper,他相當(dāng)于快遞一樣不斷的運送你要的零件到你的手里給你處理遗座。
注意了 注意了舀凛!每個線程都且僅有一個looper,這個looper需要初(zhun)始(bei)化一下prepare();途蒋,當(dāng)你準(zhǔn)備好了在開始循環(huán)loop()猛遍。
class LooperThread extends Thread {
//其他線程可以通過mHandler這個引用給該線程的消息隊列添加消息
public Handler mHandler;
public void run() {
Looper.prepare();
//需要在線程進入死循環(huán)之前,創(chuàng)建一個Handler實例供外界線程給自己發(fā)消息
mHandler = new Handler() {
public void handleMessage(Message msg) {
//Handler 對象在這個線程構(gòu)建号坡,那么handleMessage的方法就在這個線程執(zhí)行
}
};
Looper.loop();
}
}
threadlocal是個啥
這貨呢就是個線程內(nèi)部信息存儲類懊烤,我們?yōu)樯对谶@里說到它呢!宽堆?因為我們的looper就是被儲存在這貨里面的腌紧,當(dāng)然了他還是可以存好多其他類型的東西的,它可以在指定的線程中存儲然后在指定的線程中拿到你存的東西(不同線程存的東西不一樣取出來的也不一樣)畜隶,正是因為這樣的機制它可以為我們每一個線程存儲looper壁肋,畢竟你也不想自己的快遞被別人拿了對吧!
ps
流程中有兩個無限循環(huán)
- 一個是looper的 loop()方法 可以使用looper.quit()退出循環(huán)
- 一個是messagequeue的取出next()方法