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