Handler

2019-04-17  本文已影响0人  郑捡书

重点类 : Handler、Looper、MessageQueue、Message
1.Looper 的作用是将 Message 对象从 MessageQueue 中取出来,并将其交给 Handler#dispatchMessage(Message) 方法
2.Handler 的作用是将 Message 对象发送到 MessageQueue 中去,同时将自己的引用赋值给 Message#target。
3.MessageQueue 的作用负责插入和取出 Message

主线程一旦存在就创建了Looper,而Looper内部又创建了MessageQueue,所以在创建Handler的时候传入了一个Looper对象,一般我们都是获取Looper.getMainLooper(),这时候三者就关联了起来。使用Handler发送message其实就是往Looper对象的MessageQueue变量发送(起到存储的作用),而Looper内部一直在轮询(死循环阻塞)获取MessageQueue的消息,一旦获取到新消息则回调Handler的CallBack接口。

第一点解析
// 获取Message用于存放信息
Message message = mHandler.obtainMessage();

=================源码=====================

// 获取一个Message
public final Message obtainMessage()
    {
        return Message.obtain(this);
    }

// 将Handler引用赋值给Message对象的target字段
 public static Message obtain(Handler h) {
        Message m = obtain();
        m.target = h;

        return m;
    }
MessageQueue 中的 Message 是有序的吗?排序的依据是什么

是有序的。Queue 都是有序的(先进先出),Set 才是无序的,排序的依据是 Message#when 字段,表示一个相对时间,该值是由 MessageQueue#enqueueMessage(Message, Long 时间) 方法设置的。

message.sendToTarget();

==================源码==================
// 内部是handler引用调用自身的方法
public void sendToTarget() {
        target.sendMessage(this);
    }

 public final boolean sendMessage(Message msg)
    {
        return sendMessageDelayed(msg, 0);
    }

····
····
····

 最终调用MessageQueue#enqueueMessage(Message msg, long uptimeMillis)

handler处理事件源码分析
  public void dispatchMessage(Message msg) {
        // 每个Message的callback 都是Runnable接口,分开设置处理
        if (msg.callback != null) {
            handleCallback(msg);
        } else {
        // 总处理,mCallback 是构造函数传入的
            if (mCallback != null) {
                if (mCallback.handleMessage(msg)) {
                    return;
                }
            }
            // 空实现,上面mCallback ==null或者返回false都会执行
            handleMessage(msg);
        }
    }
如何判断当前线程是不是主线程
// 1
Looper.myLooper() == Looper.getMainLooper()
// 2
Looper.getMainLooper().getThread() == Thread.currentThread()
// 3  是上面2的简化
Looper.getMainLooper().isCurrentThread()

HandlerThread

上一篇下一篇

猜你喜欢

热点阅读