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

更多相关文章

  1. 大话Android的消息机制(Handler、Looper、Message...)
  2. [android—runloop] vs [ios—runloop]
  3. Android(安卓)Priority Job Queue:一个专门为Android轻松调度任务
  4. Android面经| 问题归纳
  5. Android菜鸟之路-多线程下载
  6. Android(安卓)AsyncTask
  7. Android消息机制Handler源码分析
  8. Android(安卓)AsyncTask
  9. Android进程与线程基本知识

随机推荐

  1. 【Android Studio快捷键】之代码提示
  2. 配置Android SDK环境
  3. Intent跳转到系统应用中的拨号界面、联系
  4. Android 视频深入解析
  5. 短视频源码安卓中的普通动画和属性动画的
  6. Android 网络通信框架Volley完全解析(一)
  7. 在Windows下搭建Android2.2开发环境
  8. Android wifi打开流程(Android O)
  9. Android中Media Framework浅析(一)——概述
  10. android异步线程为什么有这个错呢!