关于Android Handler如何完成线程切换

  网站讲Handler源码解析的文章有很多,这里就不重复造*了,直接切重点。

  其实子线程用Handler通过sendMessage发送消息,切换到主线程handleMessage进行处理,完成线程切换没有什么神奇的。

  首先自己也可以实现一个线程切换,声明一个全局的类,在主线程对这个类进行实例化,子线程可以通过这个类的引用来执行这个类里面的方法,这就是线程切换。Handler也是如此不过容易被大家忽略。

public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
        ........return enqueueMessage(queue, msg, uptimeMillis);
    }

 

  Handler发送消息最终会走到enqueueMessage方法

private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
        msg.target = this;
        ........return queue.enqueueMessage(msg, uptimeMillis);
    }

 

  msg.target = this,这句话让target变量指向当前发送消息的Handler,即在主线程实例化的Handler。

 public static void loop() {
        ........
        for (;;) {
        ........
           msg.target.dispatchMessage(msg);
        ........
            }
        ........
}        

  在Looper.loop()里面,通过这个Handler引用调用到Handler的dispatchMessage(Message msg)

public void dispatchMessage(Message msg) {
        if (msg.callback != null) {
            handleCallback(msg);//Handler Post了一个runnable
        } else {
            if (mCallback != null) { //判断是否实现了callback
                if (mCallback.handleMessage(msg)) { 
                    return;
                }
            }
            handleMessage(msg);//主线程方法
        }
    }

  dispatchMessage()最终走到了主线程的handleMessage方法。是不是很简单。

  

 

 

  

关于Android Handler如何完成线程切换

上一篇:游戏环境配置:React Native 开发环境配置 For Android


下一篇:【Android Developers Training】 61. 序言:使用OpenGL ES显示图像