最近重新複習一下Android基本的知識點,增加強概念性瞭解,以及梳理平常使用最多的Android消息處理機制(Handler、Looper、MessageQueue、Message)
Android與操作系統Windows一樣都是由消息驅動,而Android中實現消息驅動的要素由四點:
1、消息的格式:Message。消息結構體。包含next,next是一個Message實例,可以看出Message其實是一個鏈表。包含target成員,target是Handler實例。此外,它還包括了arg1,arg2,what,obj等參數,它們都是用於記錄消息的相關內容。
2、消息隊列:MessageQueue。消息隊列類,它包含了mMessages成員;mMessages是消息Message的實例。MessageQueue提供了next()方法來獲取消息隊列的下一則消息。
3、消息循環:Looper。消息循環類,負責從消息隊列取消息,然後通過handler轉發給UI線程,它包含mQueue成員變量,mQueue是一個消息隊列MessageQueue。
4、消息派發、處理:handler
對應的java文件路徑--(android-5.1.0_r3\frameworks\base\core\java\android\os)
創建線程消息隊列
主線程消息隊列是在應用程序啓動時,由framework層自動創建。
而如果開發者希望自己創建的子線程也擁有消息循環機制,則需開發者自己去創建。
handler.post()註釋:一般來說在工作線程中執行耗時任務,當任務完成時,會返回UI線程,一般是更新UI。這時有兩種方法可以達到目的。
一種是handler.sendMessage。發一個消息,再根據消息,執行相關任務代碼。
另一種是handler.post(r)。r是要執行的任務代碼。意思就是說r的代碼實際是在UI線程執行的。可以寫更新UI的代碼。(工作線程是不能更新UI的)
說再多不如上代碼:一個Handler的使用,並有handelr.post()主動創建線程
handler基類:
public class UIHandler<T> extends Handler{
//WeakReference 爲弱引用方式,不瞭解的朋友自行百度
protected WeakReference<T> ref;
public UIHandler(T cla){
ref = new WeakReference<T>(cla);
}
public T getRef(){
return ref != null ? ref.get() : null;
}
}
Handler 運用實例:
public class MainActivity extends Activity{
private final MainHandler mHandler = new MainHandler(this);
@Override
protected void onCreate(Bundle savedInstanceState){
super.oncreate(savedInstanceState);
setContentView(R.layout.activity_main);
//本文有對此方法的註釋,認真看的小朋友看到此處會明白
//使用方法1,
Message message=new Message();
message.what=1;
message.arg1=0;
mHandler.sendMessage(message);
//使用方法2
myhandler.post(mRunnable);
}
private static final Runnable mRunnable = new Runnable(){
@Override
public void run(){
}
};
private class MainHandler extends UIHandler{
private MainHandler(MainActivity activity){
super(activity);
}
@Override
public void handleMessage(Message msg){
super.handleMessage(msg);
MainActivity activity = (MainActivity)ref.get();
if(activity != null){
if (activity.isFinishing()
return;
switch(msg.what){
case 1:
break;
}
}
}
}
}
看到了代碼的書寫方法,但是到了現在 可能對整個消息機制的流程還不是很清楚吧。那,我們上圖(圖片來自網絡借鑑,感謝【hnust_癲狂】共享)
本文借鑑:https://blog.csdn.net/tsdfk1455/article/details/61618317