Handler,Looper,HandlerThread

news/2024/7/7 5:41:00 标签: Handler, Looper, HandlerThread

1.HandlerLooper原理

图解:

其根本点在于:
  1. Handler所在线程通过创建一个 Looper来创建一个 MessageQueue
  2. 通过在 Handler所在线程执行 Looper.loop 循环,从 MessageQueue取出消息,在Handler所在线程执行
  3. 可以从其他线程通过 Handlerxian 向这个 MessageQueue中扔 msg
在构造和使用Handler前,要先确保当前线程有 looper,且looper已经运行:
  1. Looper.prepare准备 MessageQueue
  2. Looper.loop(),取消息的循环执行起来
需要关注的是,Looper所在线程退出之前,需要调用 looper.quit() 使得线程正在执行的 loop()循环停下来;
一般我们在主线程创建的hanler不需要这么做,是因为系统会帮助我们做;
而如果我们创建的handler依赖于自己启动的线程(和自己准备的Looper),那么在线程退出时,需要调用 looper.quit() 使之结束;

2. HandlerThread

HandlerThread继承自 Thread,唯一的特殊就是:

正常Thread中是没有 Looper在运行的,而HandlerThread的run方法执行后,就会给自己的 Thread准备一个looper,

并使 looper.loop() 循环起来;

所以使用 HandlerThread 创建的线程作为 Handler所在线程时,不需要再单独准备Looper


但创建 Handler时,需要确保使用的 HandlerThread已经执行过 handlerThread.start();

只有 start调用完成 run()函数后才能准备好 Looper


补充下,这个函数里使用 synchronized(this)的原因是为了在 Looper准备好之后,通知想要使用 LooperHandler所在线程,因为Handler 是在 HandlerThread之外的其他线程创建的,所以调用 HandlerThread.getLooper()时,可能HandlerThread还没有执行完成 run函数,也即还没准备好 Looper,所以会wait直到Looper准备好:


在这个函数里可以看到,如果 Looper还没有准备好,则会wait(),直到 Looper准备好;

还有一点,函数开始时,就判断当前Thread是否 isAlive(),如果没有 alive,则返回 null,导致 Handler创建失败,而只有Thread.start 之后,Thread才会 alive,所以,这是为什么使用 HandlerThread Looper创建 Handler之前,需要先通过HandlerThread.start() 使 Thread 运行起来的原因。



同样,HandlerThread退出时,也需要调用 quit()函数来结束 Looper 在当前 HandlerThread的执行:






http://www.niftyadmin.cn/n/540531.html

相关文章

MySQL使用mysqlbinlog将binlog日志转为sql文件

一、打开mysqlbinlog.exe文件夹目录下的cmd界面 二、在目录下输入 mysqlbinlog.exe mysql-bin.000001 --result-fileD:\mysql001.sql --result-file 生成文件到D盘 注:这里不需要进入到mysql控制台中 三、结果

MySQL二进制数据恢复

一、开启配置 1.1、在[mysqld]配置文件中添加 log-binmysql-bin 或者 log-bin"C:\ProgramData\MySQL\MySQL Server 5.7\Data\mysql-bin" 比如上面的设置重启数据库会生成mysqlbin.000001文件 1.2、 进入mysql的bin目录下,打开cmd窗口输入 mysql -hlocal…

Node.js系列——(2)发起get/post请求

服务器与浏览器的交互主要方式有get/post请求。 下面,我们来看一下node.js发起get/post请求。 1、get 由于get请求的参数在url后面,所以相对比较简单。node.js中的url模块提供了parse函数来处理。具体代码如下: //引入模块 var httprequire(…

Android Watchdog 机制

用两张图和部分代码来描述: 第一张图(图片需要在新标签中打开): 第二张图借自 宇落无痕 的博客: 代码 Watchdog.run(): Overridepublic void run() {boolean waitedHalf false;while (true) {...synchroni…

连接MySQL数据源时报:Connection to 127.0.0.1:3306 Could not create connection to databas

参考连接:https://www.cnblogs.com/jcxioo/p/11606044.html 1、时区问题 jdbc:mysql://localhost:3306/youdatabasename?useUnicodetrue&characterEncodingUTF-8&useJDBCCompliantTimezoneShifttrue&useLegacyDatetimeCodefalse&serverTimezoneU…

AliOS Developer 网址

AliOS开发者网址及代码下载,有时间可以研究一下。 1.AliOS 开发者主页: https://developer.alios.cn/#/index 2.AliOS源码下载: https://developer.alios.cn/#/%2Fdevelop%2Fopen%2Fuserguide%2Fdownload?level2 repo init -u http:/…

MyEclipse 和 eclipse 最简单的安装Jetty容器插件

一、MyEclipse安装jetty 1.下载jetty插件 http://pan.baidu.com/s/1nuMYGNv 2.将下载后的jetty插件放到安装MyEclipse目录的MyEclipse 10(版本号安装自动生成)下,可以在下面单独创建个文件夹用来存放自己插件。 3.MyEclipse 10下有个dropins,在dropins下…

An IO exception occurred trying to read the shutdown command SocketTimeoutException: Read timed out

一、项目成功启动,但是访问的时候出现错误 二、错误现象: 四月 23, 2020 4:40:21 下午 org.apache.coyote.AbstractProtocol start INFO: 开始协议处理句柄["http-bio-8989"] 四月 23, 2020 4:40:21 下午 org.apache.catalina.startup.Catal…