谈谈Android中的HandlerThread
一、简介
在详细讲解这篇文章之前,应该有部分的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相关推荐
- 谈谈 Android 中的 PathClassLoader 和 DexClassLoader
[这是 ZY 第 13 篇原创技术文章] 预备知识 了解 android 基本 ClassLoader 知识 看完本文可以达到什么程度 了解 PathClassLoader 和 DexClassLoa ...
- 谈谈android中的内存泄漏
写在前面 内存泄漏实际上很多时候,对于开发者来说不容易引起重视.因为相对于crash来说,android中一两个地方发生内存泄漏的时候,对于整体没有特别严重的影响.但是我想说的是,当内存泄漏多的时候, ...
- android 代码中使用dp,简单谈谈Android中SP与DP的区别
从一开始写Android程序,就被告知这些常识 一.dp(或者dip device independent pixels) 一种基于屏幕密度的抽象单位.在每英寸160点的显示器上,1dp=1px.不同 ...
- android中sp的意义_简单谈谈Android中SP与DP的区别
从一开始写android程序,就被告知这些常识 一.dp(或者dip device independent pixels) 一种基于屏幕密度的抽象单位.在每英寸160点的显示器上,1dp=1px.不同 ...
- 摩客怎么设置安卓的dp_简单谈谈Android中SP与DP的区别
从一开始写Android程序,就被告知这些常识 一.dp(或者dip device independent pixels) 一种基于屏幕密度的抽象单位.在每英寸160点的显示器上,1dp=1px.不同 ...
- Android 中的线程有哪些,原理与各自特点
AsyncTask.HandlerThread.IntentService AsyncTask原理 内部是Handler和两个线程池实现的,Handler用于将线程切换到主线程,两个线程池一个用于任务 ...
- android属于数据库管理系统,详细谈谈Android系统中的SQLite数据库的应用
数据库是按照数据结构来组织.存储和管理数据的仓库,而在信息话的社会,数据库又不单单仅限与数据的相关内容,现在数据库技术是管理信息系统.办公自动化系统.决策支持系统等各类信息系统的核心部分,而SQL是结 ...
- Android中的多线程(字节跳动)
文章目录 Handler机制(Android中的消息队列机制) Handler机制为Android系统解决了以下两个问题 Handler常用方法 Handler的使用 补充知识点 Handler原理 ...
- Android中对Handler用法的总结
Android之Handler用法总结 方法一:(java习惯,在android平台开发时这样是不行的,因为它违背了单线程模型) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用 ...
最新文章
- 性能压测服务器502报错,一种交易系统的性能测试方法及相关服务器
- Thymeleaf——使用模板动态生成JavaScript脚本文件
- LINUX中常用操作命令
- web容器启动过程与web.xml
- C/C++,Qt,Python,OpenCV小项目实战-实时桌面颜色查询
- Android 使用代码设置selector 的图片或文字颜色
- 从“挂科大王”到网络安全布道者,云舒的那些“面壁”时刻
- oracle杅擂踱阀葩,Oracle常用傻瓜问题1000问
- c语言open不同的编码格式,C语言中open与fopen的区别
- NotificationManager和Notification区别
- 概率分布与马尔科夫链的关系讨论(上传费事)
- 12.11scrum report (第十次)
- springboot日志框架
- 计算机专业 在职跨英语,英语在职研究生跨专业可以吗?
- 【LabVIEW】基于LabVIEW的俄罗斯方块小游戏
- 音乐能力与计算机能力结合,作曲与作曲技术理论专业(计算机作曲与音乐制作)培养方案...
- 给定divId,滚动条滚到相应位置
- 阿里云服务器上搭建宝塔
- Java字符串String相关
- 从招行权证疯炒看权证风险
热门文章
- 用 JAVA 语言设计如下界面的石头剪刀布游戏。游戏的一方点击界面上石头、剪刀、布按钮,游戏的另一方计算机随机选择,然后给出游戏结果。
- android 5.1.1 评测,【小辣椒X5评测】Android 5.1 人性化贴心设计_小辣椒 X5_手机评测-中关村在线...
- PowerDesiginer导入表结构excel
- 图像语义分割快速入门--keras代码示例-----基于tensorflow2.x-----看完就会系列!!!!
- 我们应该怎么写程序?
- 致天鹅的一封信(搞笑)
- 中山市住房公积金提取
- 腾讯地图H5位置获取
- u盘文件不显示却占用空间
- EasyExcel写入多个sheet,每个sheet写多个表