网站讲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方法。是不是很简单。
原文:https://www.cnblogs.com/excelios/p/14794615.html