1.产生背景
开启Thread子线程进行耗时操作;
多次创建和销毁线程是很消耗系统资源的;
2.什么是HandlerThread
handle+thread+looper 是一个thread内部有looper
3.HandlerThread的特点
1)本质上是一个线程类,继承Thread
2)有自己的内部Looper对象,可以进行looper循环
3)通过获取HandlerThread的looper对象传递给Handler对象,可以在handleMessage方法中执行异步任务
4)优点是不会堵塞,减少了对性能的消耗,缺点是不能同时进行多任务的处理,需要等待进行处理,处理效率低
5)与线程池注重并发不同,HandlerThread是一个串行队列,HandlerThread背后只有一个线程。
HandlerThread实例
public class MainActivity extends AppCompatActivity {
private TextView mTvServiceInfo;
private HandlerThread mCheckMsgThread;
private Handler mCheckMsgHandler;
private boolean isUpdateInfo;
private static final int MSG_UPDATE_INFO = 0x110;
private Handler mHandler = new Handler();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTvServiceInfo = (TextView) findViewById(R.id.id_textview);
//创建后台线程
initBackThread();
}
@Override
protected void onResume() {
super.onResume();
//开始查询
isUpdateInfo = true;
mCheckMsgHandler.sendEmptyMessage(MSG_UPDATE_INFO);
}
@Override
protected void onPause() {
super.onPause();
//停止查询
isUpdateInfo = false;
mCheckMsgHandler.removeMessages(MSG_UPDATE_INFO);
}
@Override
protected void onDestroy() {
super.onDestroy();
//释放资源
mCheckMsgThread.quit();
}
private void initBackThread() {
mCheckMsgThread = new HandlerThread("check-message-coming");
mCheckMsgThread.start();
mCheckMsgHandler = new Handler(mCheckMsgThread.getLooper()){
@Override
public void handleMessage(Message msg) {
checkForUpdata();
if (isUpdateInfo){
mCheckMsgHandler.sendEmptyMessageDelayed(MSG_UPDATE_INFO,1000);
}
}
};
}
//模拟从服务器解析数据
private void checkForUpdata(){
try {
//模拟耗时
Thread.sleep(1000);
mHandler.post(new Runnable() {
@Override
public void run() {
String result = "实时更新中,当前大盘指数:<font color='red'>%d</font>";
result = String.format(result,(int)(Math.random()*3000+1000));
mTvServiceInfo.setText(Html.fromHtml(result));
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
网友评论