Java的消息机制
最近重新复习一下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 extends Handler{ //WeakReference 为弱引用方式,不了解的朋友自行百度 protected WeakReference ref; public UIHandler(T cla){ ref = new WeakReference(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
更多相关文章
- Android Priority Job Queue:一个专门为Android轻松调度任务的工
- Android菜鸟之路-多线程下载
- Android消息机制Handler源码分析
- Android消息提示框Toast
- 【Unity3D】与Android相互传递消息
- Android消息机制源码分析