handler是如何切换线程的
2020-08-09 本文已影响0人
小马奔腾走天下
handler是消息处理者,把消息放到messagequeue,并对消息进行处理。
首现 在一个线程中, new Handler() 必须先执行,Looper.prepare() 创先looper,
主线程没有手动调用Looper.prepare(),是因为 app启动时,在ActivityThread main主入口,执行了 Looper.prepareMainThread.
public static void prepareMainLooper() { ... }
实际线程间切换,就是通过线程间共享变量实现的。
示例,两个线程 A线程 B线程
在A线程new handler(),在b线程调用这个handler发送消息,这个message发送到了,A线程中的 messageQueue里面,又回到了a线程中执行。
handler 持有Looper实例,looper有持有messageQueue实例, handler 把message发送到了 当前持有的messageQueue实例中。这个messageQueue 在new handler之前,已经通过当前线程的Looper.prepare创建了。