您好,登錄后才能下訂單哦!
這篇文章主要介紹“Android中怎么應用Message機制”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Android中怎么應用Message機制”文章能幫助大家解決問題。
一、線程間通訊的Message機制
1、Message介紹
frameworks\base\core\java\android\Os\Message.java
Message是線程之間傳遞信息的載體,包含了對消息的描述和任意的數據對象。Message中包含了兩個額外的 int字段和一個object字段,這樣在大部分情況下,使用者就不需要再做內存分配工作了。雖然Message的構造函數是public的,但是***是 使用Message.obtain( )或Handler.obtainMessage( )函數來獲取Message對象,因為Message的實現中包含了回收再利用的機制,可以提供效率。
2、MessageQueue介紹
frameworks\base\core\java\android\Os\MessageQueue.java
MessageQueue用來容納Message隊列的,其中的Message是由Looper來分發的,Message不能直接添加到MessageQueue中,而是要通過與Looper關聯的Handler去添加。
3、Looper
frameworks\base\core\java\android\Os\Looper.java
Looper是線程用來運行消息循環的。線程本身是沒有消息循環的,需要在線程中調用perpare函數,然后調用loop去處理消息。在Android中,系統在啟動主線程的時候會自動為之建立一個Looper。
建立本線程的Looper:
public static final void prepare()
運行本線程的Looper:
public static final void loop()
獲取本線程的Looper:
public static final Looper myLooper()
獲取主線程的Looper:
public synchronized static final Looper getMainLooper()
4、Handler
frameworks\base\core\java\android\Os\Handler.java
Handler是用來發送和處理與線程相關聯的Message和Runnable對象的。每個Handler都與一個單獨的線程以及線程消息隊列相 關聯的。當你創建Handler時,Handler就與線程以及線程消息隊列綁定了,從那以后,Handler就可以將 Message和Runnable發送給對應的消息隊列,并且能夠處理從消息隊列中出來的消息。
Handler提供了用戶需要調用的大部分接口
A、創建Handler:
創建與本地線程相關聯的Handler:
public Handler()
public Handler(Callback callback)
創建與指定線程相關聯的Handler:
public Handler(Looper looper)
public Handler(Looper looper, Callback callback)
B、創建消息
public final Message obtainMessage() public final Message obtainMessage(int what) public final Message obtainMessage(int what, Object obj) public final Message obtainMessage(int what, int arg1, int arg2) public final Message obtainMessage(int what, int arg1, int arg2, Object obj)
C、刪除消息
刪除在消息隊列中未處理的消息
public final void removeMessages(int what) public final void removeMessages(int what, Object object)
D、發送消息
public final boolean sendMessage(Message msg) public final boolean sendMessageDelayed(Message msg, long delayMillis) public final boolean post(Runnable r) public final boolean postDelayed(Runnable r, long delayMillis)
E、處理消息
在Looper的loop函數中循環取出MessageQueue的接收消息隊列中的消息,然后調用Hander的dispatchMessage函數對消息進行處理,至于如何處理(相應消息)則由用戶指 定(三個方法,優先級從高到低:Message里面的Callback,一個實現了Runnable接口的對象,其中run函數做處理工 作;Handler里面的mCallback指向的一個實現了Callback接口的對象,里面的handleMessage進行處理;處理消息 Handler對象對應的類繼承并實現了其中handleMessage函數,通過這個實現的handleMessage函數處理消息)。
public void dispatchMessage(Message msg) { if (msg.callback != null) { handleCallback(msg); } else { if (mCallback != null) { if (mCallback.handleMessage(msg)) { return; } } handleMessage(msg); } }
二、Message機制的用途
Message機制有兩種用途:
定時執行:延遲到指定時間執行消息調度
線程通訊:將某些操作在其他線程中排隊執行
1、定時執行
通過本線程的Handler將消息延遲到指定時間執行,相當于定時器的作用
public final boolean sendMessageDelayed(Message msg, long delayMillis) public final boolean postDelayed(Runnable r, long delayMillis)
還可以在指定時間到期之前,通過removeMessages取消執行
2、線程通訊
Android的UI是單線程的,Android希望UI線程能夠給予User快速的反應,如果UI線程花費太多的時間做幕后的事情,吵過5秒 鐘,Android就會給出錯誤提示。因此為了避免拖住UI,一下較費時的工作應該交給獨立的線程去執行。但是如果幕后的線程來執行UI對 象,Android又會發出錯誤信息,所以UI線程與幕后線程需要進行通訊。UI線程將工作分發給幕后線程,幕后線程執行后將相應的狀態返回給UI線程, 讓UI線程對UI做成相應的更新。
總結:所謂的消息機制其實很簡單,實現這種機制需要只需要四步:
1、實例化Looper(因為實例化Handler時需要一個looper);
2、實例化Handler,這里需要覆蓋handleMessage方法,處理收到的消息;
3、 實例化Message對象,調用已經實例化好的handler對象的obtainMessage方法,把數據傳給obtainMessage方 法,obtainMessage方法就會實例化一個Message對象。(這里也可以發送實現Runnable接口的對象);
4、調用Handler的sendMessage方法把實例化好的Message對象發送出去。對每個線程過程都是一樣的,只要按照上面的四個步驟來就可以發送和接收消息了。
關于“Android中怎么應用Message機制”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。