最近重新复习一下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_癫狂】共享)

Java的消息机制_第1张图片

 

本文借鉴:https://blog.csdn.net/tsdfk1455/article/details/61618317

更多相关文章

  1. Android Priority Job Queue:一个专门为Android轻松调度任务的工
  2. Android菜鸟之路-多线程下载
  3. Android消息机制Handler源码分析
  4. Android消息提示框Toast
  5. 【Unity3D】与Android相互传递消息
  6. Android消息机制源码分析

随机推荐

  1. Eclipse如何打开Package Explorer
  2. android apk安装原理分析
  3. Android 开发者的 Flutter(二) —— Flutte
  4. android 简单实现,微信第三方登录
  5. android EditText输入限制,只输入数字电话
  6. 认识Android中的MVP设计模式
  7. Android 显示意图和隐式意图的区别
  8. Android 样式系统 | 主题背景和样式
  9. 【Android(安卓)开发教程】TableLayout表
  10. Android属性动画——实现灵动菜单效果