1. HandlerThread extends Thread:
  • 本质依然是一个Thread,只不过进行了队列化的包装,使得Handler能与其配合工作.
  1. 初始化时必须指定Thread的name, 但是Priority可以使用默认的Process.THREAD_PRIORITY_DEFAULT.
  2. 其run()函数的逻辑很简单:
  • 首先获取Tid就是Thread的Id.
  • 然后调用Looper.prepare().
  • 同步HandlerThread对象(synchronized (this)), 将mLooper设置为当前线程的Looper(TLS, 并且notifyAll(), 需要同步和notify的原因是HandlerThread的getLooper()在HandlerThread没有run()起来的时候是是需要同步wait()的)
  • Process.setThreadPriority(mPriority)设置Thread自己的优先级.
  • onLooperPrepared(); 回调.
  • Looper.loop() 开始干活,loop()不断的从自己的MessageQueue中取出Message进行执行.
  • 如果loop()结束,那么代表这个HandlerThread也即将结束,会将mTid设置为-1.
  1. getThreadId()会返回mTid
  2. getLooper():
  • 如果Thread已经死了(!isAlive()), 直接返回null.
  • 否则同步自己(原因上面说过了), 一个while(isAlive() && mLooper == null) 调用wait(), 中间有任何的InterruptedException会catch住,在run()中Looper就绪以后,会notifyAll()引发一个InterruptedException,这时候mLooper != null,退出循环等待, 返回mLooper
  1. quit()/quitSafely():
  • 在获取到可用的Looper后,调用looper的quit()/quitSafely(), 两者的区别:
  • quit(): looper直接终止,不再处理在MessageQueue中的Message. quit()之后,再postMessage会fail.
  • quitSafely(): 让looper尽可能快的将MessageQueue中所有已经到期需要执行的Message进行执行然后再终止,其他没有到期的Task则被drop, 再postMessage会fail.
  • 如果thread尚未开始,或者已经结束,那么会返回false.