Android Handler 机制

       Android中提供一种异步机制Hander,通过Handler 可以完成一种长时间后台执行后的回调通知。本文介绍Android Handher机制,如图1所显示,Handler机制共包含三个组件:Handler、Looper、MessageQueue。

      

                                                      图1: Handler 实现机制

        Handler中包含了Looper执行对象,messageQueue。其中Handler将消息及执行runnable 送到MessageQueue中。由Looper负责将MessageQueue中的消息读取出来,并分发执行。因为Looper中存在localtread,可以实现异步执行。

        Handler的处理:

        1. Handler 通过SendMessageAPIs,如:sendEmptyMessageDelayed,sendEmptyMessageAtTime等API将消息发送到MessageQueue中

        2. 在Handler生成消息时,通过  msg.target = this;将Message的target指定成当前Handler。

        3. Handler可以将未执行的Message从消息队列中删除,通过RemoveMessageAPIs来实现,如:removeMessages

        4. Handler同样可以发生一runnable对象到消息队列中,实现异步执行。注意真正执行的线程是Looper中的现成,runnable只是提供一个Run方法

        Looper的处理:

        Looper中线程不停的从消息队列中读取消息,并分发执行,读取的每一个消息都通过 msg.target.dispatchMessage(msg)来分发执行。从Handler处理中的2可知,msg.target 就是对应的Handler。再回过头来看Handler中dispatchMessage的实现。

       

 1. public void dispatchMessage(Message msg) {
 2.       if (msg.callback != null) {
 3.           handleCallback(msg);
 4.       } else {
 5.          if (mCallback != null) {
 6.               if (mCallback.handleMessage(msg)) {
 7.                   return;
 8.               }
 9.           }
 10.           handleMessage(msg);
 11.       }
 12.   }

1. 第二行的msg.callback就是handler处理中的Post的Runnable,如果是post的Runnable,runnable就是对应的callback,那么执行Runable的run方法。

2. 如果不是post的Runnable,那就看Handler自身有没有设置Callback,如果有,那么先有Callback来执行,上述第5行代码。该callback可以通过Handler的构造函数来设置

3. 最后将会执行Handler中的handleMessage函数,通常情况我们在使用Handler时都会重写Handler中的handleMessage方法来实现我们需要的功能。

         注意事项:Hanlder对应的Looper都有一个线程,在主线程中已经创建了,如果在非主线程中创建Handler,需要先生成Looper。如下:

 class MyThread extends Thread {

                public void run() {               
    
                        // 其它线程中新建一个handler
                        Looper.prepare();// 创建该线程的Looper对象,用于接收消息,在非主线程中是没有looper的所以在创建handler前一定要使用prepare()创建一个Looper
                        myThreadHandler = new Handler() {
                                public void handleMessage(android.os.Message msg) {
                                        Log.d(Constant.TAG, MessageFormat.format("Thread[{0}]--myThreadHandler handleMessage run...", Thread
                                                        .currentThread().getName()));
                                }
                        };
                        Looper.myLooper().loop();//建立一个消息循环,该线程不会退出
                }
        }


         

      




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值