Handler

作者: 郑捡书 | 来源:发表于2019-04-17 10:10 被阅读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

    相关文章

      网友评论

          本文标题:Handler

          本文链接:https://www.haomeiwen.com/subject/xljbpqtx.html