Android(安卓)多线程:HandlerThread理解和使用总结
16lz
2021-01-26
Android HandlerThread目录.png
一、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(); }
相关文章:
Android多线程:理解和简单使用总结
Handler vs Timer,究竟该用哪个?
更多相关文章
- SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
- Android(安卓)多线程:手把手教你使用AsyncTask
- android 跨进程访问service方法
- android 2.3安装
- 关于android 版本更新中“java.lang.SecurityException:Permissi
- [Android] Otto源码简析
- Android(安卓)APP优化—Android程序员必须掌握
- Android类参考---HandlerThread
- RxJava2 学习笔记