本文共 1324 字,大约阅读时间需要 4 分钟。
前置知识
1.Thread的run方法和start方法区别
直接调用run方法,run中的内容并不会另起一个线程运行,只有调用start方法才可以
2.ThreadLocal
ThreadLocal 的get方法会获得 Threadlocal在相应线程set的值。
----------------------------------------------------------------------------------------------------------------------------
1.Looper 这个类内部有一个
sThreadLocal 的静态成员变量
2.new Handler的时候会在handler内部给mLooper赋值,
mLooper = Looper.myLooper();
最终用的是Looper内部这个静态成员变量的sThreadLocal.get()方法,
3.如果这个sThreadLocal 在当前线程下没有获取到looper,则证明
Looper.prepare()在该线程下没有被调用过
4.这样,每个线程就都有自己的Looper
5.在new Handler 的时候 ,该handler还会获取当前线程先对应的looper的mQueue赋给
handler的成员变量mQueue
6.当调用一个成功创建了的handler 的post 方法时,最终会调用该handler的queue
的enqueueMessage方法 也就是looper的queue的方法,该方法将会把handler作为target变量存入message中
7.Looper.prepare()方法做了两件事
(1)new了一个Looper
new Looper又可以细分为 new 了一个MessageQueue
以及赋值Thread.currentThread()给mThread这个变量
(2)将这个Looperset到Looper类的threadLocal变量中
8.Looper.loop()方法
把queue给运行起来,相当于一个死循环,在不停的从queue中取出来msg
msg将会调用msg的target(即handle)的dispatchMessage方法
该方法最终会调用 handler的handleMessage方法
总结 1.Looper.prepare Looper.loop后 ,messagequeue的无限循环就开始了
2. 该循环从messagequeue中取出message,message再调用其target(Handler)的dispatchMessage方法,
最终调用handleMessage方法。
Handler Message MessageQueue Looper
自己看源码分析,比看别人写的乱七八糟的文章管用的多。
=========================
拓展:
HandlerThread 自带looper的Thread
ActivityThread 主线程
Handler,MessageQueue的这种机制其实就是是生产者,消费者机制。
转载地址:http://zkgwn.baihongyu.com/