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();
}
}