一、简介

在详细讲解这篇文章之前,应该有部分的Android初级开发者并没用使用过HandlerThread,最常使用的消息传递机制应该离不开Handler,那么Handler跟HandlerThread有什么不同呢,好处又在哪里?

名詞 解释
Handler 在android中负责发送和处理消息,通过它可以实现其他支线线程与主线程之间的消息通讯
Thread 进程中执行运算的最小单位,亦即执行处理机调度的基本单位
HandlerThread 一个继承自Thread的类HandlerThread,Android中没有对Java中的Thread进行任何封装,而是提供了一个继承自Thread的类HandlerThread类,这个类对Java的Thread做了很多便利的封装

二、作用

HandlerThread是Thread的子类,HandlerThread本身就是一个线程,可以实现工作线程和主线程之间的通信,只是这个线程内部有一个Looper,而这个Looper有一个消息队列MessageQue,它通过不断的用Looper去检查MessageQue然后取出消息交给Handler处理,UI主线程本身亦是如此,HandlerThread可以分担MainLooper的工作量,降低了主线程的压力,使主界面更流畅。

三、优点

  • HandlerThread本质上是通过继承Thread类和封装Handler类的使用,从而使得创建新线程和与其他线程进行通信变得更加方便易用。
  • 降低主线程的压力,使主界面更流畅。
  • HandlerThread拥有自己的消息队列,它不会干扰或阻塞UI线程。

四、具体实现

public class MainActivity extends AppCompatActivity {Handler mainHandler,workHandler;HandlerThread mHandlerThread;TextView tv_content;Button button1,button2,button3;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 显示文本tv_content= (TextView) findViewById(R.id.text1);// 创建与主线程关联的HandlermainHandler = new Handler();/*** 步骤1:创建HandlerThread实例对象* name: 线程名* priorit: 线程优先级*/mHandlerThread = new HandlerThread("handlerThread",Process.THREAD_PRIORITY_BACKGROUND);/*** 步骤2:启动线程*/mHandlerThread.start();/*** 步骤3:创建工作线程Handler,复写handleMessage()*/workHandler = new Handler(mHandlerThread.getLooper()){@Override// 消息处理的操作public void handleMessage(Message msg){switch(msg.what){// 消息1case 1:try {//延时操作Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}// 通过主线程Handler.post方法进行在主线程的UI更新操作mainHandler.post(new Runnable() {@Overridepublic void run () {tv_content.setText("鱼王");}});break;// 消息2case 2:try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}mainHandler.post(new Runnable() {@Overridepublic void run () {tv_content.setText("海王");}});break;default:break;}}};/*** 步骤4:使用工作线程Handler向工作线程的消息队列发送消息* 在工作线程中,当消息循环时取出对应消息 & 在工作线程执行相关操作*/// 点击Button1button1 = (Button) findViewById(R.id.button1);button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 通过sendMessage()发送Message msg = Message.obtain();//消息的标识msg.what = 1; // 消息的存放msg.obj = "111"; workHandler.sendMessage(msg);}});// 点击Button2button2 = (Button) findViewById(R.id.button2);button2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 通过sendMessage()发送Message msg = Message.obtain();//消息的标识msg.what = 2; // 消息的存放msg.obj = "2222"; // b. 通过Handler发送消息到其绑定的消息队列workHandler.sendMessage(msg);}});// 点击Button3button3 = (Button) findViewById(R.id.button3);button3.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//结束线程,即停止线程的消息循环mHandlerThread.quit();}});}}

当我们调用Looper的quit方法时,实际上执行了MessageQueue中的removeAllMessagesLocked方法,该方法的作用是把MessageQueue消息池中所有的消息全部清空,无论是延迟消息(延迟消息是指通过sendMessageDelayed或通过postDelayed等方法发送的需要延迟执行的消息)还是非延迟消息。

总结

归根到底,HandlerThread可以分担MainLooper的工作量,降低了主线程的压力,使主界面更流畅,但是有是有引用HandlerThread的时候可能会引发内存泄漏,即:在Handler消息队列还有未处理的消息 / 正在处理消息时,此时若需销毁外部类MainActivity,但由于上述引用关系,垃圾回收器(GC)无法回收MainActivity,从而造成内存泄漏,下一篇博文会针对内存泄漏展开详细解说。

谈谈Android中的HandlerThread相关推荐

  1. 谈谈 Android 中的 PathClassLoader 和 DexClassLoader

    [这是 ZY 第 13 篇原创技术文章] 预备知识 了解 android 基本 ClassLoader 知识 看完本文可以达到什么程度 了解 PathClassLoader 和 DexClassLoa ...

  2. 谈谈android中的内存泄漏

    写在前面 内存泄漏实际上很多时候,对于开发者来说不容易引起重视.因为相对于crash来说,android中一两个地方发生内存泄漏的时候,对于整体没有特别严重的影响.但是我想说的是,当内存泄漏多的时候, ...

  3. android 代码中使用dp,简单谈谈Android中SP与DP的区别

    从一开始写Android程序,就被告知这些常识 一.dp(或者dip device independent pixels) 一种基于屏幕密度的抽象单位.在每英寸160点的显示器上,1dp=1px.不同 ...

  4. android中sp的意义_简单谈谈Android中SP与DP的区别

    从一开始写android程序,就被告知这些常识 一.dp(或者dip device independent pixels) 一种基于屏幕密度的抽象单位.在每英寸160点的显示器上,1dp=1px.不同 ...

  5. 摩客怎么设置安卓的dp_简单谈谈Android中SP与DP的区别

    从一开始写Android程序,就被告知这些常识 一.dp(或者dip device independent pixels) 一种基于屏幕密度的抽象单位.在每英寸160点的显示器上,1dp=1px.不同 ...

  6. Android 中的线程有哪些,原理与各自特点

    AsyncTask.HandlerThread.IntentService AsyncTask原理 内部是Handler和两个线程池实现的,Handler用于将线程切换到主线程,两个线程池一个用于任务 ...

  7. android属于数据库管理系统,详细谈谈Android系统中的SQLite数据库的应用

    数据库是按照数据结构来组织.存储和管理数据的仓库,而在信息话的社会,数据库又不单单仅限与数据的相关内容,现在数据库技术是管理信息系统.办公自动化系统.决策支持系统等各类信息系统的核心部分,而SQL是结 ...

  8. Android中的多线程(字节跳动)

    文章目录 Handler机制(Android中的消息队列机制) Handler机制为Android系统解决了以下两个问题 Handler常用方法 Handler的使用 补充知识点 Handler原理 ...

  9. Android中对Handler用法的总结

    Android之Handler用法总结 方法一:(java习惯,在android平台开发时这样是不行的,因为它违背了单线程模型) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用 ...

最新文章

  1. 性能压测服务器502报错,一种交易系统的性能测试方法及相关服务器
  2. Thymeleaf——使用模板动态生成JavaScript脚本文件
  3. LINUX中常用操作命令
  4. web容器启动过程与web.xml
  5. C/C++,Qt,Python,OpenCV小项目实战-实时桌面颜色查询
  6. Android 使用代码设置selector 的图片或文字颜色
  7. 从“挂科大王”到网络安全布道者,云舒的那些“面壁”时刻
  8. oracle杅擂踱阀葩,Oracle常用傻瓜问题1000问
  9. c语言open不同的编码格式,C语言中open与fopen的区别
  10. NotificationManager和Notification区别
  11. 概率分布与马尔科夫链的关系讨论(上传费事)
  12. 12.11scrum report (第十次)
  13. springboot日志框架
  14. 计算机专业 在职跨英语,英语在职研究生跨专业可以吗?
  15. 【LabVIEW】基于LabVIEW的俄罗斯方块小游戏
  16. 音乐能力与计算机能力结合,作曲与作曲技术理论专业(计算机作曲与音乐制作)培养方案...
  17. 给定divId,滚动条滚到相应位置
  18. 阿里云服务器上搭建宝塔
  19. Java字符串String相关
  20. 从招行权证疯炒看权证风险

热门文章

  1. 用 JAVA 语言设计如下界面的石头剪刀布游戏。游戏的一方点击界面上石头、剪刀、布按钮,游戏的另一方计算机随机选择,然后给出游戏结果。
  2. android 5.1.1 评测,【小辣椒X5评测】Android 5.1 人性化贴心设计_小辣椒 X5_手机评测-中关村在线...
  3. PowerDesiginer导入表结构excel
  4. 图像语义分割快速入门--keras代码示例-----基于tensorflow2.x-----看完就会系列!!!!
  5. 我们应该怎么写程序?
  6. 致天鹅的一封信(搞笑)
  7. 中山市住房公积金提取
  8. 腾讯地图H5位置获取
  9. u盘文件不显示却占用空间
  10. EasyExcel写入多个sheet,每个sheet写多个表