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