一、Android中的HandlerThread
1.1 主要作用
每隔几秒钟更新数据或图片等。
1.2 原理
继承了Thread,实际上是一个使用Looper、Handler的线程。
- 继承了Thread,在
run()
方法中通过Looper.prepare()
来创建消息队列,Looper.loop()
来循环处理消息。- 使用时开启HandlerThread,创建Handler与HandlerThread的Looper绑定,Handler以消息的方式通知HandlerThread来执行一个具体的任务。
1.3 特点
HandlerThread内部维护了一个消息队列,避免多次创建和销毁子线程来进行操作。
二、HandlerThread的使用
2.1 HandlerThread使用步骤
(1)创建HandlerThread实例,参数字符串定义新线程的名称。
HandlerThread mHandlerThread = new HandlerThread("check-message-coming");
(2)启动HandlerThread线程。
mHandlerThread.start();
(3)创建Handler对象,将HandlerThread的Lopper作为参数,这样就完成了Handler对象与HandlerThread的Looper对象的绑定(这里的Handler对象可以看作是绑定在HandlerThread子线程中,所以handlerMessage里的操作是在子线程中运行的)。 重写handleMessage处理耗时操作。
Handler mCheckMsgHandler = new Handler(mHandlerThread.getLooper()){
@Override
public void handleMessage(Message msg){
// 进行耗时操作
}
};
这样我们就可以使用mCheckMsgHandler对象以处理消息的形式来进行耗时操作,完成以后就可以切换到主线程的handler中来更新UI。
2.2 HandlerThread使用示例
依据刚才的步骤,来实现一个每秒更新数据的一个功能,这个功能可以用来更新股票、商品价格等。
-
创建和启动HandlerThread,handler绑定:新建Activity,在
onCreate()
中进行使用一个initBackThread()
方法创建HandlerThread。等待mCheckMsgHandler 得到消息开始模拟耗时操作完成后切换到UI线程去更新UI,使用主线程的Handler也是一样的。
private void initBackThread(){
// 1.创建HandlerThread
mHandlerThread = new HandlerThread("check-message-coming");
// 2.启动HandlerThread线程
mHandlerThread.start();
// 3.创建Handler对象绑定该线程的Looper
mCheckMsgHandler = new Handler(mHandlerThread.getLooper()){
@Override
public void handleMessage(Message msg){
//模拟耗时操作
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 主线程更新数据
runOnUiThread(new Runnable() {
@Override
public void run() {
String result = "每隔1秒更新一下数据:"+Math.random();
mInfoText.setText(result);
}
});
if(isUpdate){ //1s后再次发送消息进行耗时操作
mCheckMsgHandler.sendEmptyMessageDelayed(MSG_UPDATE_INFO, 1000);
}
}
};
}
- 绑定按钮使用handler发送消息:一个开始按钮使mCheckMsgHandler发送消息去进行耗时操作,另一个按钮停止发送消息。标记isUpdate设置是否再次发送消息更新。
mInfoText = (TextView) findViewById(R.id.tv_info_count);
findViewById(R.id.btn_start).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//开始更新
isUpdate = true;
mCheckMsgHandler.sendEmptyMessage(MSG_UPDATE_INFO);
}
});
findViewById(R.id.btn_stop).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//停止更新
isUpdate = false;
mCheckMsgHandler.removeMessages(MSG_UPDATE_INFO);
}
});
- 要记得在
onPause()
和onDestroy()
中暂停更新和停止mHandlerThread以释放内存。
@Override
protected void onPause() {
super.onPause();
isUpdate = false;
mCheckMsgHandler.removeMessages(MSG_UPDATE_INFO);
}
@Override
protected void onDestroy(){
super.onDestroy();
//释放资源
mHandlerThread.quit();
}