HandlerThread 内部会持有一个Handler, 算是Handler和Thread的一个合体,
HandlerThread.start() 的话执行run这个方法,截下源码:
@Override public void run() { mTid = Process.myTid(); Looper.prepare(); synchronized (this) { mLooper = Looper.myLooper(); notifyAll(); } Process.setThreadPriority(mPriority); onLooperPrepared(); Looper.loop(); mTid = -1; }
抽取几个关键步骤: 1. 获取Looper 2. Looper开始循环
Looper.prepare() 这个方法会帮助构建出一个Looper, 这个Looper会被存在Looper的sThreadLocal这个变量里, 这个sThreadLocal是线程本地存储,独一份。
Looper.myLooper()这个方法通过sThreadLocal.get()拿到Looper,
Looper.loop() 开始Looper循环,
for (;;) { Message msg = queue.next(); // might block if (msg == null) { // No message indicates that the message queue is quitting. return; }
开启了死循环,不断遍历MessageQueue, 消息为空会退出循环,
使用场景分析:
这个Handler属于这个线程的,这个线程对应有一个Looper,
Handler : Looper : Thread 这三者是1 :1 : 1的关系,
在需要给这个Thread通信的时候, 可以借助HandlerThread ,通过handler发送消息给这个线程,源码截取:
/** * @return a shared {@link Handler} associated with this thread * @hide */ @NonNull public Handler getThreadHandler() { if (mHandler == null) { mHandler = new Handler(getLooper()); } return mHandler; }
如何退出消息循环 ?
HandlerThread 提供了一个quit方法
public boolean quit() { Looper looper = getLooper(); if (looper != null) { looper.quit(); return true; } return false; }
通过quit方法可以退出消息循环,