簡單介紹handler
handler的概念:handler是給我們提供用來更新UI的機(jī)制吮铭,也是一套消息處理機(jī)制,我們可以發(fā)送消息,也可以處理消息栅表。
handler的作用:因?yàn)樵贏ndroid中,主線程不建議做耗時(shí)操作师枣,子線程比建議更新UI,但是Android開發(fā)怪瓶,其實(shí)就是搭建好頁面,將服務(wù)器的數(shù)據(jù)展示到頁面上践美,所以使用網(wǎng)絡(luò)請(qǐng)求會(huì)非常頻繁洗贰,而網(wǎng)絡(luò)請(qǐng)求屬于耗時(shí)操作,需要放在子線程完成陨倡,但一般情況下也不會(huì)通過子線程更新UI敛滋,需要將請(qǐng)求成功的數(shù)據(jù)發(fā)送到主線程進(jìn)行UI更新,所以一般會(huì)使用到handler兴革。
Handler執(zhí)行流程:首先handler作為任務(wù)執(zhí)行者绎晃,一般創(chuàng)建在主線程,當(dāng)子線程有需要發(fā)送的數(shù)據(jù)杂曲,通過創(chuàng)建message對(duì)象庶艾,使用handler對(duì)象將消息發(fā)送到messagequeue,messagequeue遵循了隊(duì)列先進(jìn)先出的原則擎勘,當(dāng)主線程的looper循環(huán)消息的時(shí)候落竹,會(huì)按照messagequeue隊(duì)列的順序循環(huán)消息,并將消息給到任務(wù)執(zhí)行者h(yuǎn)andler去執(zhí)行任務(wù)货抄。
Handler執(zhí)行原理:Handler創(chuàng)建完成后述召,內(nèi)部的Looper以及MessageQueue就可以和Handler一起協(xié)同工作,然后通過Hadler的post方法將一個(gè)Runnable投遞到Handler內(nèi)部的Looper中去處理蟹地,也可以通過Handler的send方法發(fā)送一個(gè)消息积暖,這個(gè)消息會(huì)在Looper中做處理。Post最終也是通過send來完成的怪与。當(dāng)Handler的send方法被調(diào)用時(shí)夺刑,他會(huì)調(diào)用MessageQueue的enqueueMessage方法將這個(gè)消息放入消息隊(duì)列中,然后Looper發(fā)現(xiàn)有新消息到來時(shí)分别,就會(huì)處理這個(gè)消息遍愿,最終消息中的Runnable或者Handler的handlerMessage方法就會(huì)被調(diào)用。Looper是運(yùn)行在Handler所在的線程耘斩,所以就把業(yè)務(wù)邏輯切換到主線程了
對(duì)于ThreadLocal和HandlerThread的介紹
ThreadLocal
定義:ThreadLocal是線程內(nèi)部的數(shù)據(jù)存儲(chǔ)類沼填,通過他可以在指定的線程中存儲(chǔ)數(shù)據(jù),該數(shù)據(jù)只有在指定線程中可以獲取
使用場景:當(dāng)某些數(shù)據(jù)是以線程為作用域并且不同線程具有不同的數(shù)據(jù)副本的時(shí)候另外還可以使用在復(fù)雜邏輯下的對(duì)象傳遞括授。
HandlerThread
handlerThread設(shè)計(jì)方面比較高效快捷坞笙,它幫你把任務(wù)的發(fā)送岩饼,處理都封裝了起來,包括幫你封裝了Looper對(duì)象薛夜,不需要再手動(dòng)創(chuàng)建籍茧。而Thread則不行。handlerThread解決了同步問題梯澜,在主線程創(chuàng)建此類并且獲取子線程的hanlder對(duì)象寞冯,不會(huì)報(bào)空指針。
因?yàn)樵创a里幫這個(gè)線程提升了優(yōu)先級(jí)晚伙。