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<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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值