- final class Looper:类注释概括的很好:
- 这个类是用于在一个Thread内运行message loop, 一个Thread默认是没有一个message loop的, 为了创建一个,可以在thread的运行中调用prepare()来将loop创建出来(TLS), 然后调用loop()来开始对消息的处理直到loop停止
- 大多数和message loop交互是通过handler进行的.
- static final ThreadLocal sThreadLocal = new ThreadLocal();
- 因为每个线程有自己的message loop, 那么显然需要的是一个ThreadLocal(TLS)来为每个线程维护自己的Looper的引用
- private static Looper sMainLooper:
- MainLooper的概念就如同Android中的MainThread,即这个MainLooper是MainThread的Looper.
- 维护了一个MessageQueue引用,一个Thread引用,一个volatile的boolean 的mRun(该变量会涉及到多线程,但是因为只有一个线程会修改,其它都是读,因此volatile可以满足需求)
- prepare() prepare(boolean quitAllowed):
- 首先确保Thread对应的Looper的TLS还没有被创建,否则会抛异常.
- 如果没有,那么会new一个Looper并将其放入到TLS中.
- prepareMainLooper():
- 其本身和prepare()没有太大区别(除了quitAllowed = false), 唯一的区别是会将sMainLooper设置为刚才生成的Looper的引用, 因为这个会调用调用此函数的线程的Looper成为mainLooper,Thread成为mainThread, 一般都是由Android系统自己在配置环境的时候调用的。
- 对sMainLooper会引入同步,因为getMainLooper()可能会被别的线程调用
- loop(),static 方法,因为Looper是和线程绑定的,不应该依赖于一个具体的Looper对象来进行looper,而应该是自己取出线程的Looper的TLS来进行loop:
- 获取所在线程的Looper.
- 如果looper是null, 那么直接抛异常.
- for无限循环调用MessageQueue的next()来获取要进行的task, 如果next()的返回结果是null, 那么就代表messagequeue要结束,直接return,looper的loop()方法结束
- msg**.target.dispatchMessage**(msg), 根据messag的target来进行那个msg的分发.
- 最后要将next出的message进行recycle,因为message是池化的资源(每次new的话,因为调用次数太频繁,过于浪费)
- isCurrentThread():
- Thread.currentThread() == mThread
- mThread在Looper被new的时候 = Thread.currentThread().
- quit()/quitSafely():
- MessageQueue的Quit(false)/Quit(true)
- postSyncBarrier()/removeSyncBarrier(int token), 控制Message处理流的办法
- 该方法用来挂起当前所有pending的同步的Message的处理
- 直到removeSyncBarrier(…)被调用。
- postSyncBarrier()会返回一个token值, 这个token值用于后面removeSyncBarrier(token)时作为参数填入.
- 前面所说的异步的Message不会受到这个Barrier的影响
- setMessageLogging(Printer printer):
- 更多debug时使用,指定一个将Looper相关log输出的printer.