最簡潔系列介紹:對(duì)于理科生來說有條理的知識(shí)結(jié)構(gòu)更便于記憶和學(xué)習(xí)與理解,比起無比詳細(xì)的文章和成段的代碼替废,知識(shí)框架更容易分析問題和定位問題龄寞。這系列的文章現(xiàn)在還在嘗試階段粮彤,如果您有好的意見兵志,歡迎交流醇蝴!
一、解決問題
1想罕、理解Handler原理悠栓;
2、一個(gè)線程里面可以有多少個(gè)Looper,多少個(gè)消息隊(duì)列,多少個(gè)Handler惭适;
3笙瑟、消息隊(duì)列的結(jié)構(gòu);
4癞志、消息隊(duì)列沒有消息的時(shí)候往枷,Loope是什么狀態(tài);
5凄杯、延時(shí)消息的是怎么實(shí)現(xiàn)的师溅;
6、當(dāng)消息隊(duì)列中沒有Message時(shí)盾舌,線程是什么狀態(tài);
二蘸鲸、原理
1妖谴、整體邏輯:Handler通常用于線程之間通信,以子線程和主線程通信為例酌摇。 主線程默認(rèn)會(huì)初始化一個(gè)Looper,Looper會(huì)不斷的輪詢它的消息隊(duì)列膝舅。Handler中會(huì)有一個(gè)消息隊(duì)列成員變量,它在那個(gè)線程中生成對(duì)象窑多,就會(huì)將自己的消息隊(duì)列指向相應(yīng)線程Looper的消息隊(duì)列仍稀,但他向自己的消息隊(duì)列發(fā)送信時(shí),相當(dāng)于時(shí)向相應(yīng)線程的消息隊(duì)列發(fā)送消息埂息;
2技潘、消息邏輯
三、問題解決
1千康、一個(gè)線程中只有一個(gè)Looper享幽,Looper的修飾是final ,生成Looper的構(gòu)造方法是私有的,生成Looper通過調(diào)用Looper.prepare()方法拾弃,這個(gè)方法會(huì)先判斷有無Looper,消息隊(duì)列是在Looper中產(chǎn)生的值桩,自然也就只有一個(gè)。Handler可以有多個(gè)豪椿,message成員變量target用于指向Handler,所以在發(fā)送的時(shí)候知道對(duì)應(yīng)關(guān)系奔坟;
2、消息隊(duì)列的結(jié)構(gòu)是一個(gè)鏈表結(jié)構(gòu)搭盾。Message中有一個(gè)next成員變量會(huì)指向下一個(gè)Message咳秉;
3、消息隊(duì)列沒有消息的時(shí)候會(huì)是阻塞狀態(tài)鸯隅,當(dāng)有消息的時(shí)候會(huì)去喚醒滴某;
4、當(dāng)前消息的時(shí)間如果還沒有到,會(huì)不發(fā)送霎奢,并且設(shè)置喚醒一個(gè)時(shí)間户誓;
5、當(dāng)消息隊(duì)列沒有消息時(shí)幕侠,線程會(huì)阻塞帝美,沒錯(cuò)是阻塞并且還是主線程,不要驚訝晤硕,為什么操作屏幕時(shí)不會(huì)卡頓悼潭,是因?yàn)槠聊坏乃⑿乱彩峭ㄟ^Handler發(fā)送消息完成的,有消息來會(huì)重新喚醒線程舞箍。不要被阻塞嚇住舰褪,如果不阻塞,主線程沒事可干就結(jié)束了疏橄,主線程結(jié)束占拍。。捎迫。晃酒。這你肯定沒有遇到過吧!
四窄绒、應(yīng)用
線程的之間的通信很多都適用Handler 例如異步任務(wù)贝次,IntentService,HandlerThread,以后有機(jī)會(huì)會(huì)給大家出一系列最簡單的介紹。