从Looper代码看,Looper 是跟当前调用方法
Looper.prepare();
的线程绑定的,会在当前调用的线程创建一个 Looper对象用于绑定当前线程,而且会存在 Looper 的这个成员变量中 ,那些就可以确保每个线程(调用过 Looper.prepare)的线程 存有当前的Looper
ThreadLocal<Looper> sThreadLocal
此时 已经为当前的线程 创建了一个Looper,并在Looper中创建好一个 MessageQueue 用来队列消息。此时 Looper,thread,MessageQueue 都绑定在一起。
然后 通过 调用 Looper.loop()
开始循环等待 Message的到来。
Handler
上面描述的看上去与handler没有关系。
当handler在这个线程 new的时候 (这个线程必须 已经 Looper.prepare();
也就是说这个线程必须已经绑定了looper),这个时候 handler 回去通过 Looper.myLooper()
来获取 当前的looper 并拿到 MessageQueue,
后续 handler 的message post也好,send 也好都会丢到 这个拿到的 MessageQueue 中 ,也就是说会跟 当前的在哪个线程上new 的就绑到那个线程 上 这样就连起来了。Thread,Looper,MessageQueue,Handler;
所以 那种说是在非UI线程上更新UI的,所用到的Handler必须是在 main 线程上创建的,不然他绑不到main线程去。(操蛋的是 android 的UI 必须是在main线程上更新的,当然 如果你sufaceview 那又不一样了)
所以这两个玩意只是用来在把一个线程变成那种基于消息通知模式。