HandlerThread继承了Thread,也是线程的一种,只是它比一般线程多了一个Looper,也就是多了消息循环机制,线程start()时会自动创建和启动一个Looper。
当我们需要一个常驻的子线程(而不是一次性消耗品)来不定期的执行一些任务时,我们就需要创建HandlerThread,而不是一般的Thread(一般的Thread执行完就会自动销毁)。
记得关闭HandlerThread线程:
这里要注意一个问题:线程不会随着应用程序的关闭而销毁,所以在退出程序时,记得在activity的OnDestroy()里销毁你创建的HandlerThread,不然随着你多次打开应用,会产生多个HandlerThread线程。
跟其它线程一样,HandlerThread是可不可以随着stop而销毁,不过经过本人测试,你可以调用:getLooper().quit();来退出这个线程,其实原理很简单,就是改变在消息循环里面标志位,退出整个while循环,使线程执行完毕。
如:
protected void onDestroy() {
//这里的workHandler是与我创建的HandlerThread绑定的一个Handler
//你也可以用你创建的HandlerThread.getLooper().quit();
workHandler.getLooper().quit();
super.onDestroy();
}
案例二:
public class MainActivity extends Activity {
MainHandler mainHandler;//主线程的handler
Handler workHandler; //子线程的handler,用于把耗时操作post进子线程
Button btn_start;
Button btn_stop;
TextView tv1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_start = (Button)findViewById(R.id.button1);
btn_stop = (Button)findViewById(R.id.button2);
tv1 = (TextView)findViewById(R.id.tv1);
mainHandler = new MainHandler();
HandlerThread workThread = new HandlerThread("workThread");
workThread.start();//记得先启动HandlerThread
//把HandlerThread的Looper传给workHandler,使这个handler与子线程绑定
workHandler = new Handler(workThread.getLooper());
btn_start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
workHandler.post(jiShu_run);
}
});
btn_stop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
workHandler.removeCallbacks(jiShu_run);
}
});
}
class MainHandler extends Handler {
public MainHandler() {
super();
}
//要绑定looper一定要复写这个构造函数
public MainHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
tv1.setText("" + msg.arg1);
}
}
Runnable jiShu_run = new Runnable() {
int num = 0;
@Override
public void run() {
//进行后台耗时操作,完了就把数据返回给前台更新
Message msg = mainHandler.obtainMessage();
msg.arg1 = num;
msg.sendToTarget();
num++;
//隔1s把此runnable post进子线程的messageQueue中
workHandler.postDelayed(jiShu_run, 1000);
}
};
@Override
protected void onDestroy() {
workHandler.getLooper().quit();
super.onDestroy();
}
}