最近重新复习一下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