Android Handler机制
1.什么是Handler?
??Handler是可以通過(guò)發(fā)送和處理Message和Runnable對(duì)象來(lái)關(guān)聯(lián)相應(yīng)線程的MessageQueue。通常我們認(rèn)為它是一種異步機(jī)制。
??a.可以讓對(duì)應(yīng)的Message和Runnable在未來(lái)的某個(gè)時(shí)間點(diǎn)進(jìn)行相應(yīng)的處理。
??b.讓自己想要的耗時(shí)操作在子線程中完成,讓更新UI的操作在主線程中完成,而子線程與主線程之間的通信就是靠Handler來(lái)完成。
2.Handler內(nèi)部的實(shí)現(xiàn)機(jī)制
??面試的時(shí)候,Handler的原理問(wèn)到的概率還是蠻大的,不光只是為了面試,我們好好去了解一下Handler的原理,那么對(duì)于我們?nèi)ナ褂肏andler而言是非常有好處的,至少我們知道我們發(fā)送的消息如何發(fā)送到了UI線程的,當(dāng)出現(xiàn)問(wèn)題時(shí),我們只要小小一分析便會(huì)知道問(wèn)題發(fā)生于何處,然后解決它,好了,閑話不多扯了,下面來(lái)介紹Handler機(jī)制的實(shí)現(xiàn)原理。
??Handler機(jī)制也可叫異步消息機(jī)制,它主要由4個(gè)部分組成:Message,Handler,MessageQueue,Looper,在上面我們已經(jīng)接觸到了Message和Handler,接下來(lái)我們對(duì)4個(gè)成員進(jìn)行著重的了解:
1.Message
??Message是在線程之間傳遞的消息,它可以在內(nèi)部攜帶少量的信息,用于在不同線程之間交換數(shù)據(jù)。使用Message的arg1和arg2便可攜帶int數(shù)據(jù),使用obj便可攜帶Object類(lèi)型數(shù)據(jù)。
2.Handler
??Handler顧名思義就是處理者的意思,它只要用于在子線程發(fā)送消息對(duì)象Message,在UI線程處理消息對(duì)象Message,在子線程調(diào)用sendMessage方法發(fā)送消息對(duì)象Message,而發(fā)送的消息經(jīng)過(guò)一系列地輾轉(zhuǎn)之后最終會(huì)被傳遞到Handler的handleMessage方法中,最終在handleMessage方法中消息對(duì)象Message被處理。
3.MessageQueue
??MessageQueue就是消息隊(duì)列的意思,它只要用于存放所有通過(guò)Handler發(fā)送過(guò)來(lái)的消息。這部分消息會(huì)一直存放于消息隊(duì)列當(dāng)中,等待被處理。每個(gè)線程中只會(huì)有一個(gè)MessageQueue對(duì)象,請(qǐng)牢記這句話。其實(shí)從字面上就可以看出,MessageQueue底層數(shù)據(jù)結(jié)構(gòu)是隊(duì)列,而且這個(gè)隊(duì)列只存放Message對(duì)象。
4.Looper
??Looper是每個(gè)線程中的MessageQueue的管家,調(diào)用Looper的loop()方法后,就會(huì)進(jìn)入到一個(gè)無(wú)限循環(huán)當(dāng)中,然后每當(dāng)MesssageQueue中存在一條消息,Looper就會(huì)將這條消息取出,并將它傳遞到Handler的handleMessage()方法中。每個(gè)線程只有一個(gè)Looper對(duì)象。
??了解了上述Handler機(jī)制的4個(gè)成員后,我們?cè)賮?lái)把思路理一遍:首先在UI線程我們創(chuàng)建了一個(gè)Handler實(shí)例對(duì)象,無(wú)論是匿名內(nèi)部類(lèi)還是自定義類(lèi)生成的Handler實(shí)例對(duì)象,我們都需要對(duì)handleMessage方法進(jìn)行重寫(xiě),在handleMessage方法中我們可以通過(guò)參數(shù)msg來(lái)寫(xiě)接受消息過(guò)后UIi線程的邏輯處理,接著我們創(chuàng)建子線程,在子線程中需要更新UI的時(shí)候,新建一個(gè)Message對(duì)象,并且將消息的數(shù)據(jù)記錄在這個(gè)消息對(duì)象Message的內(nèi)部,比如arg1,arg2,obj等,然后通過(guò)前面的Handler實(shí)例對(duì)象調(diào)用sendMessge方法把這個(gè)Message實(shí)例對(duì)象發(fā)送出去,之后這個(gè)消息會(huì)被存放于MessageQueue中等待被處理,此時(shí)MessageQueue的管家Looper正在不停的把MessageQueue存在的消息取出來(lái),通過(guò)回調(diào)dispatchMessage方法將消息傳遞給Handler的handleMessage方法,最終前面提到的消息會(huì)被Looper從MessageQueue中取出來(lái)傳遞給handleMessage方法,最終得到處理。這就是Handler機(jī)制整個(gè)的工作流程
?
3.如何使用Handler讓子線程與子線程之間進(jìn)行通信?
??如今的面試,Handler基本上很多面試者都會(huì)流暢的說(shuō)出來(lái),但是如果想要給面試官亮點(diǎn),那就需要我們對(duì)Handler了解的十分透徹,我們通常代碼中是子線程與主線程進(jìn)行異步通信,那么子線程與子線程之間也可以嗎?當(dāng)然可以,只不過(guò)我們需要對(duì)Looper足夠了解,深入研究Hanlder你可以看筆者Handler源碼分析部分。那么我們?nèi)绻枰泳€程A和子線程B之間進(jìn)行Handler通信,而且是子線程A向子線程B發(fā)送消息,那么我們應(yīng)該怎樣做呢?
public class MainActivity extends AppCompatActivity {private Handler threadHandler;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}class ThreadA extends Thread{@Overridepublic void run() {super.run();Looper.prepare();threadHandler = new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);//收到來(lái)自于ThreadB的消息,注意這里運(yùn)行在ThreadA線程中//......}};Looper.loop();}}class ThreadB extends Thread{@Overridepublic void run() {super.run();Looper looper = Looper.myLooper();Message message = new Message();message.obj = "ThreadB發(fā)送消息到ThreadA";//......threadHandler.sendMessage(message);}}}- 筆者寫(xiě)的這份代碼也許不好,但是沒(méi)有關(guān)系,我們只需要學(xué)會(huì)其中幾個(gè)關(guān)鍵的地方,如何讓ThreadB往ThreadA中發(fā)送消息,首先你得在ThreadA中準(zhǔn)備一個(gè)Looper,也就是消息輪詢(xún)大管家,然后準(zhǔn)備發(fā)送消息的Handler,準(zhǔn)備發(fā)送消息的Handler很容易理解,那就是在ThreadA中生成一個(gè)Handler對(duì)象即可,那么準(zhǔn)備Looper怎么做呢?在ThreadA中調(diào)用Looper.prepare(),然后再調(diào)用Looper.loop()即可
?
關(guān)于handler更多:https://blog.csdn.net/qq_30107007/article/details/88662219
總結(jié)
以上是生活随笔為你收集整理的Android Handler机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 怎么在计算机上设置复印机双面打印,Wor
- 下一篇: android sina oauth2.