Handler与线程

news2025/1/18 9:09:28

简介

Handler提供的种异步消息处理机制是:当它发出一个消息进入消息队列后,发送消息的函数立刻返回,接着主线程会逐个地从消息队列中把消息取出,然后对消息进行处理。明显,Handler发送消息和接收消息是异步进行的,Handler跟线程没有关系。
Handler可以在一个线程内部做异步的消息处理,也可以在线程之间做异步消息处理。
默认情况下,每个Handler实例都会被绑定到创建它的线程中(一般是位于主线程),即 Handler和它的调用者实际上是处于同一线程的。

示例

通过输出Activity和Handler所在线程的ID值,证明Handler和调用它的Activity是在同一个线程中的。
第一步:在主布局文件中依次提供三个onClick属性值分别为fun1、fun2、fun3的Button控件。
第二步:修改MainAcvitity类的代码如下所示:

public class MainActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		System.out.println("MainActivity  " + Thread.currentThread().getId());
	}
	Handler handler  = new  Handler() {
		@Override
		public void handleMessage(Message msg) { 
			super.handleMessage(msg);
			System.out.println("Handler  " + Thread.currentThread().getId());
		}
	};
	Runnable runnable = new Runnable() {
		public void run() {
			System.out.println("Runnable " + Thread.currentThread().getId());
			Message msg = handler.obtainMessage();
			handler.sendMessage(msg);
		}
	};
	public void fun1(View view) {  // 在一个线程的内部做异步消息处理
		Message msg = handler.obtainMessage();
		handler.sendMessage(msg);	//发送消息到消息队列。此处参数不为null,否则报空指针
	}
	public void fun2(View view) { // 在一个线程的内部做异步消息处理
		handler.post(runnable); // 把线程对象runnable加入到消息队列当中
	}
	public void fun3(View view) { // 在线程之间做异步消息处理
		new Thread(runnable).start();
	}
}

Handler类的sendMessage()和post()方法是将参数放到同一个消息队列中,由此可知消息队列不仅可以放Message,还可以放Runnable。
运行程序,依次单击fun1、fun2、fun3三个按钮,结果如下图所示。
在这里插入图片描述

分析上面程序运行结果可以得出如下结论:

  • 通过fun1或fun2与fun3的比较,证明了Handler可以在一个线程内部做异步的消息处理,也可以在线程之间做异步消息处理。
  • 不管是在主线程中还是在子线程中启动Handler,Handler所在的线程的id与主线程的id都相同,这证明了Handler和调用它的Activity实际上是处于同一线程的。
  • 调用handler.post()方法执行Runnable对象的时候,并没有调用start()方法真正另外启动一个新的线程,而是直接在原有的线程上调用了run()方法。
  • 通过new Thread(runnable).start()调用handler时, runnable位于新开启的线程当中,但handler仍在主线程中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/387121.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三八送什么数码产品好?适合送礼的数码产品

数码产品是我们生活中比较常见到的物品,相比较于一般礼物的观赏性,它的实用性更强一些,所以如果你不知道送什么礼物给别人的话,数码产品也是不错的选择。 一、南卡小音舱蓝牙耳机 这个时代的女性,变得越来越自信了&am…

ChatGPT解答:根据使用者输入的字符串,自动判断规则,并给出各种正则表达式,用Python实现

ChatGPT解答: 根据使用者输入的字符串,自动判断规则,并给出各种正则表达式,用Python实现 根据输入的字符串,自动给出正则表达式 根据使用者输入的字符串,自动判断规则,并给出各种正则表达式&am…

JVM系统优化实践(7):垃圾回收器与垃圾回收算法

您好,我是湘王,这是我的CSDN博客,欢迎您来,欢迎您再来~上回说到了年轻代、老年代与数据计算的一个案例。接下来就先讲一讲年轻代和老年代的两个垃圾回收器:ParNew和CMS。和Serial垃圾回收器一样&#xff0c…

实战:yaml方式安装ingress-nginx-2023.3.2(测试成功)

实战:yaml方式安装ingress-nginx-2023.3.2(测试成功) 目录 文章目录实战:yaml方式安装ingress-nginx-2023.3.2(测试成功)目录实验环境实验软件1、安装过程2、第一个示例关于我最后最后实验环境 实验环境: 1、win10,vmwrokstation虚机&#x…

AI_News周刊:第四期

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 News 1.对抗“唤醒人工智能”马斯克招募团队开发 OpenAI 竞争对手 据两位直接了解这项工作的人士和另一位了解情况的人士透露,埃隆马斯克最近几周与人工智能研究人员接洽,商讨成…

详细分析什么是进程?如何理解进程状态?

什么是进程? 比较官方一点的回答是:当一个程序加载到内存的时候,就是一个进程。 但是这是不准确的回答,进程是怎么在内存中形成的,以及内存是如何管理进程的,是通过什么描述进程的?下面我们将…

Neo4j数据库部署配置

这里写目录标题一、neo4j图形数据库安装与部署1.1配置JDK运行环境(注意jdk与neo4j版本对应)1.2部署Neo4j(注意jdk与neo4j版本对应)二、数据库基本操作演示一、neo4j图形数据库安装与部署 1.1配置JDK运行环境(注意jdk与…

centos安装rocketmq

centos安装rocketmq1 下载rocketmq二进制包2 解压二进制包3 修改broker.conf4 修改runbroker.sh和runserver.sh的JVM参数5 启动NameServer和Broker6 安装rockermq dashboard(可视化控制台)1 下载rocketmq二进制包 点击rocketmq二进制包下载地址,下载完成之后通过ft…

javaEE 初阶 — 数据链路层中的以太网数据帧

文章目录以太网帧格式1. MAC 地址2. MAC 地址是如何与 IP 地址相互配合的3. 以太网帧格式中的类型MTU(了解)以太网帧格式 数据链路层主要考虑的是相邻的两个结点之间的传输。 这里最知名的协议就是 以太网。 一个以太网数据帧有三个部分组成。帧头载荷…

【GlobalMapper精品教程】055:GM坐标转换器的巧妙使用

GM软件提供了一个简单实用的坐标转换工具,可以实现地理坐标和投影坐标之间的高斯正反算及多种转换计算。 文章目录 一、坐标转换器认识二、坐标转换案例1. 地理坐标←→地理坐标2. 地理坐标←→投影坐标三、在输出坐标上创建新的点四、其他转换工具的使用一、坐标转换器认识 …

653600-56-7,Ac4GaINAz,N-叠氮四酰化半乳糖用于PROTAC合成

基础产品数据:CAS号:653600-56-7中文名:N-叠氮四酰化半乳糖,叠氮修饰半乳糖英文名: Ac4GaINAzAc4GaINAz结构式(Structural):详细产品数据:分子式:C16H22N4O10…

python学习——【第二弹】

前言 上一篇文章 python学习——【第一弹】给大家介绍了python中的基本数据类型等,这篇文章接着学习python中的运算符的相关内容。 运算符 python中的运算符主要有:算术运算符,赋值运算符,比较运算符,布尔运算符以及…

NPP夜间灯光遥感数据读取与可视化

1、Google Earth EngineGoogle Earth Engine是Google推出的行星尺度的遥感云计算平台,提供了大量遥感数据的集成与运算工具。同时也包括DMSP和NPP夜间灯光遥感数据(月尺度和年尺度)。这里给出样例的可视化代码。var dataset ee.ImageCollect…

1.2 CSS标签选择器,类选择器

CSS选择器: 根据不同的需求选出不同的标签,进行美化装饰 1. 标签选择器 标签选择器(元素选择器):用 HTML标签名作为选择器,按标签名称进行分类,为页面某一类标签指定统一的CSS样式 作用: 可以把某一类标签全部选中&…

UWB通道选择、信号阻挡和反射对UWB定位范围和定位精度的影响

(一)介绍检查NLOS操作时需要考虑三个方面:(1)由于整体信号衰减,通信范围减小。(2)由于直接路径信号的衰减,导致直接路径检测范围的减小。(3)由于阻…

记录--手摸手带你撸一个拖拽效果

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 最近看见一个拖拽效果的视频(抖音:艾恩小灰灰),看好多人评论说跟着敲也没效果,还有就是作者也不回复大家提出的一些疑问,本着知其然必要知其所以然…

栈帧之局部变量表(Local Variables)解读

局部变量表也被称之为局部变量数组或本地变量表 定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量,这些数据类型包括各类基本数据类型、对象引用(reference),以及returnAddress类型。由于局部变量表…

2023最新版本RabbitMQ下载安装教程

一、RabbitMQ简介 RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。主要用于在进程、应用程序和服务器之间交换数据,可以通过插件支持进行扩展,支持许多协议,并提供高性能、可靠性、集群和高可用队列。 AMQP :Advanced Me…

2023年疫情开放,国内程序员薪资涨了还是跌了?大数据告诉你答案

自从疫情开放,国内各个行业都开始有复苏的迹象,尤其是旅游行业更是空前暴涨,那么互联网行业如何? 有人说今年好找工作多了,有人说依然是内卷得一塌糊涂,那么今年开春以来,各个岗位的程序员工资…

第十四届蓝桥杯模拟赛(第三期)试题与题解 C++

目录 一、填空题 (一)最小的十六进制(答案:2730) (二)Excel的列(答案:BYT) (三)相等日期(答案:70910) (四)多少种取法(答案:189)…