线程-关于HandlerThread

本文详细介绍了HandlerThread的工作原理及其使用方法。HandlerThread是一种特殊的线程,它内置了一个Looper,可以实现消息循环机制。适用于需要长时间运行并执行周期性任务的场景。文章通过一个完整的示例展示了如何创建和使用HandlerThread。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HandlerThread继承了Thread,也是线程的一种,只是它比一般线程多了一个Looper,也就是多了消息循环机制,线程start()时会自动创建和启动一个Looper
当我们需要一个常驻的子线程(而不是一次性消耗品)来不定期的执行一些任务时,我们就需要创建HandlerThread,而不是一般的Thread(一般的Thread执行完就会自动销毁)。
记得关闭HandlerThread线程:
这里要注意一个问题:线程不会随着应用程序的关闭而销毁,所以在退出程序时,记得在activityOnDestroy()里销毁你创建的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
//HandlerThreadLooper传给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();
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值