多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
#### 11.2.3 HandlerThread [HandlerThread](https://www.androidos.net.cn/android/6.0.1_r16/xref/frameworks/base/core/java/android/os/HandlerThread.java)继承了Thread,它是一种可以使用Handler的Thread,它的实现也很简单,就是**在run方法中通过Looper.prepare()来创建消息队列,并通过Looper.loop()来开启消息循环,这样在实际的使用中就允许在HandlerThread中创建Handler了**。HandlerThread的run方法如下所示。 ``` package android.os; public class HandlerThread extends Thread { int mPriority; int mTid = -1; Looper mLooper; public HandlerThread(String name) { super(name); mPriority = Process.THREAD_PRIORITY_DEFAULT; } public HandlerThread(String name, int priority) { super(name); mPriority = priority; } protected void onLooperPrepared() { } @Override public void run() { mTid = Process.myTid(); Looper.prepare(); synchronized (this) { mLooper = Looper.myLooper(); notifyAll(); } Process.setThreadPriority(mPriority); onLooperPrepared(); Looper.loop(); mTid = -1; } public Looper getLooper() { if (!isAlive()) { return null; } // If the thread has been started, wait until the looper has been created. synchronized (this) { while (isAlive() && mLooper == null) { try { wait(); } catch (InterruptedException e) { } } } return mLooper; } public boolean quit() { Looper looper = getLooper(); if (looper != null) { looper.quit(); return true; } return false; } public boolean quitSafely() { Looper looper = getLooper(); if (looper != null) { looper.quitSafely(); return true; } return false; } public int getThreadId() { return mTid; } } ``` run方法如下 ``` @Override public void run() { mTid = Process.myTid(); Looper.prepare(); synchronized (this) { mLooper = Looper.myLooper(); notifyAll(); } Process.setThreadPriority(mPriority); onLooperPrepared(); Looper.loop(); mTid = -1; } ``` 从HandlerThread的实现来看,它和普通的Thread有显著的不同之处。 * 普通Thread主要用于在run方法中执行一个耗时任务, * 而**HandlerThread在run方法内部创建了消息队列,外界需要通过Handler的消息方式来通知HandlerThread执行一个具体的任务**。 **HandlerThread是一个很有用的类,它在Android中的一个具体的使用场景是IntentService**,IntentService将在11.2.4节中进行介绍。**由于HandlerThread的run方法是一个无限循环,因此当明确不需要再使用HandlerThread时,可以通过它的quit或者quitSafely方法来终止线程的执行,这是一个良好的编程习惯**。