HandlerThread和Handler之间的关系

2024-01-19 05:58

本文主要是介绍HandlerThread和Handler之间的关系,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

针对HandlerThread这里首先还是简单的分析一下源码吧,HandlerThread类是继承Thread类,并且实现了run()方法,代码如下:

@Overridepublic void run() {mTid = Process.myTid();Looper.prepare();synchronized (this) {mLooper = Looper.myLooper();notifyAll();}Process.setThreadPriority(mPriority);onLooperPrepared();Looper.loop();mTid = -1;}
 
从代码中可以看出调用的Looper类中的prepare()方法和loop()方法,并且得到了Looper对象。这些主要是对自己做一些初始化。 
我们是如何使用HandlerThread类的,下面写了简单的代码: 
public class MainActivity extends Activity {private HandlerThread mHandlerThread = null;private Handler mThreadHandler = null;private Handler mUIHandler = null;//主线程(UI线程)中的Handler对象@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();mThreadHandler.post(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stub//这里Toast.makeText(MainActivity.this, "线程名字 === " + Thread.currentThread().getName(), Toast.LENGTH_LONG).show();}});mUIHandler.postDelayed(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubToast.makeText(MainActivity.this, "线程名字 === " + Thread.currentThread().getName(), Toast.LENGTH_LONG).show();}}, 4000);}private void init() {mHandlerThread = new HandlerThread("HandlerThread");//这里的构造函数是给该HandlerThread一个名字mHandlerThread.start();//调用start()方法即run()方法初始化LoopermThreadHandler = new Handler(mHandlerThread.getLooper());//得到HandlerThread中的Looper对象mUIHandler = new Handler();}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}}
 



mThreadHandler运行的结果如下,其中Toast显示线程的名字就是刚才创建时所定义的:




mUIHandler是延时4秒中运行的,主要是为了和mThreadHandler时间错开,4秒后的运行结果如下,显示的线程名字为main,

就是主线程:

 







从上面简单的例子分析可以知道其中的Runnable接口是运行在不同的线程中。由于(mThreadHandler)run()方法不是运行在主线程中
,所以可以在其执行比较耗时的操作。其实HandlerThread也可以通过Thread和Handler组合实现,在前面Handler——简单分析中写了
简单的代码实现。


以上对HandlerThread和Handler进行了比较和测试,可以知道HandlerThread主要是对Looper进行初始化,并提供一个Looper对象
给新创建的Handler对象,使得Handler处理消息事件在子线程中处理。这样就发挥了Handler的优势,同时又可以很好的和线程结合
到一起。上面也提到Thread和Handler组合可以实现,但是为什么Android系统还要封装这么一个类呢,主要还是体现Android系统
组件的思想,同时也方便了开发者开发。


其实在实际的开发中我们也可以用到HandlerThread类和Handler类组合,当我们想服务端(通过Socket)发送消息是需要进行网络
的操作,必须开线程进行操作,并且该线程处理完一次发送消息后需要在等待下一次数据的到来,也就是像Handler中的Looper一样
一直等待新的消息过来处理。具体实现过程如上面的代码所示,创建好Handler后直接调用post(Runnable run)方法,
或者sendMessage(),这些消息的处理都在HandlerThread线程中处理的。

这篇关于HandlerThread和Handler之间的关系的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/621441

相关文章

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

linux中使用rust语言在不同进程之间通信

第一种:使用mmap映射相同文件 fn main() {let pid = std::process::id();println!(

O(n)时间内对[0..n^-1]之间的n个数排序

题目 如何在O(n)时间内,对0到n^2-1之间的n个整数进行排序 思路 把整数转换为n进制再排序,每个数有两位,每位的取值范围是[0..n-1],再进行基数排序 代码 #include <iostream>#include <cmath>using namespace std;int n, radix, length_A, digit = 2;void Print(int *A,

16 子组件和父组件之间传值

划重点 子组件 / 父组件 定义组件中:props 的使用组件中:data 的使用(有 return 返回值) ; 区别:Vue中的data (没有返回值);组件方法中 emit 的使用:emit:英文原意是:触发、发射 的意思components :直接在Vue的方法中声明和绑定要使用的组件 小炒肉:温馨可口 <!DOCTYPE html><html lang="en"><head><

数据流与Bitmap之间相互转换

把获得的数据流转换成一副图片(Bitmap) 其原理就是把获得倒的数据流序列化到内存中,然后经过加工,在把数据从内存中反序列化出来就行了。 难点就是在如何实现加工。因为Bitmap有一个专有的格式,我们常称这个格式为数据头。加工的过程就是要把这个数据头与我们之前获得的数据流合并起来。(也就是要把这个头加入到我们之前获得的数据流的前面)      那么这个头是

读软件设计的要素04概念的关系

1. 概念的关系 1.1. 概念是独立的,彼此间无须相互依赖 1.1.1. 一个概念是应该独立地被理解、设计和实现的 1.1.2. 独立性是概念的简单性和可重用性的关键 1.2. 软件存在依赖性 1.2.1. 不是说一个概念需要依赖另一个概念才能正确运行 1.2.2. 只有当一个概念存在时,包含另一个概念才有意义 1.3. 概念依赖关系图简要概括了软件的概念和概念存在的理

数据依赖基础入门:函数依赖与数据库设计的关系

在数据库设计中,数据依赖 是一个重要的概念,它直接影响到数据库的结构和性能。函数依赖 作为数据依赖的一种,是规范化理论的基础,对数据库设计起着至关重要的作用。如果你是一名数据库设计的初学者,这篇文章将帮助你理解函数依赖及其在数据库设计中的应用。 什么是数据依赖? 数据依赖 是指同一关系中属性间的相互依赖和制约关系,它是数据库设计中语义的体现。在现实世界中,数据之间往往存在某种依赖关系,而这