主要源码
public class HandlerThread extends Thread {
Looper mLooper;
...省略代码
@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;
}
}
总结
- HandlerThread是Thread的子类
- 启动线程后,会创建这个线程的looper,并且启动loop循环。
- HandlerThread便创建了一个带有looper循环的线程。
- HandlerThread对外提供了getLooper方法。
- HandlerThread提供了quit方法来中断loop循环。
一个例子
public class HandlerThreadActivity extends AppCompatActivity implements View.OnClickListener {
private View mBtn1;
private HandlerThread mWorkThread;
private Handler mWorkThreadHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handler_thread);
mBtn1 = findViewById(R.id.btn1);
mBtn1.setOnClickListener(this);
mWorkThread = new HandlerThread("handler_thread");
mWorkThread.start();
Looper looper = mWorkThread.getLooper();
mWorkThreadHandler = new WorkThreadHandler(looper);
}
@Override
public void onClick(View v) {
logs("onClick 发送消息 thread " + Thread.currentThread().getName());
mWorkThreadHandler.sendEmptyMessage(0);
}
public class WorkThreadHandler extends Handler {
public WorkThreadHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
String threadName = Thread.currentThread().getName();
logs("handleMessage thread name is " + threadName);
Toast.makeText(HandlerThreadActivity.this , "thread "
+ Thread.currentThread().getName(), Toast.LENGTH_LONG).show();
}
}
public void logs(String text) {
android.util.Log.i("jue","HandlerThreadActivity -> " + text);
}
@Override
protected void onDestroy() {
super.onDestroy();
mWorkThread.quit();
}
}
注意:
- onDestroy的时候,要注意执行HandlerThread的quit方法来终止loop。
- 我们在主线程发送消息,在工作线程执行handleMessage。