1.Handler簡(jiǎn)介
Android中規(guī)定只允許在UI主線程當(dāng)中來(lái)操作UI,在子線程中不允許更新UI,而當(dāng)我們需要在子線程中進(jìn)行一些耗時(shí)操作完成后需要更新界面UI,此時(shí)我們?cè)撛趺崔k,這個(gè)時(shí)候我們就可以用到Handler,所以可以說(shuō)Handler的作用是為了通知主線程更新ui,但這只是Handler的一個(gè)作用,只是我們開發(fā)時(shí)常常用Handler來(lái)更新UI而已。在這里很多人會(huì)疑問為什么規(guī)定要只能在主線程更新UI,因?yàn)槎鄠€(gè)子線程來(lái)同時(shí)操作UI的話,則容易造成很多不可知的現(xiàn)象,即線程是不安全的,很多人也會(huì)疑問為啥不用鎖機(jī)制呢,鎖機(jī)制的話有兩個(gè)缺點(diǎn):a、鎖機(jī)制讓UI更新邏輯變得更復(fù)雜 b、鎖機(jī)制會(huì)阻礙一些線程,使更新效率大大降低。
2.Handler消息機(jī)制中關(guān)聯(lián)到的一些類:Looper,MessageQueue,ThreadLocal,Message等
3.Handler源碼分析
首先看構(gòu)造函數(shù)
上面的源碼清晰的說(shuō)明:首先會(huì)獲取當(dāng)前線程的Looper對(duì)象,為null則直接報(bào)錯(cuò),因此在子線程中我們必須自己調(diào)用Looper.PRepare()來(lái)創(chuàng)建Looper對(duì)象,其次獲取到Looper對(duì)象后則獲取looper當(dāng)中的MessageQueue對(duì)象,這兩個(gè)對(duì)象獲取到后對(duì)消費(fèi)的分發(fā)處理則有了保障。這兩個(gè)類后面會(huì)詳細(xì)描述。
接著看我們常用的handmessage方法和sendMessage方法,我們主要說(shuō)這兩個(gè)方法。
這個(gè)handmessage方法我們要實(shí)現(xiàn)的,其實(shí)實(shí)際上是dispatchMessage方法中處理消息,這個(gè)很簡(jiǎn)單,大家應(yīng)該都看得懂。接下來(lái)sendMessage方法:
這個(gè)方法也很簡(jiǎn)單,相信大家都看得懂,簡(jiǎn)單就是調(diào)用MessageQueue的enqueueMessage方法把消息存進(jìn)MessageQueue中。也就是Handler其實(shí)是一個(gè)領(lǐng)導(dǎo)者,它通過協(xié)調(diào)Looper和MessageQueue等進(jìn)行協(xié)同作業(yè)。
4.Looper源碼分析
Looper輪詢器的意思,就是無(wú)限輪詢MessageQueue中的消息,有就發(fā)出來(lái)讓handler處理,沒有就等待中。
同樣看prepare()方法和loop()兩個(gè)關(guān)鍵方法:
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注