Android Handler、Message、MessageQueue和Looper官方说明
Handler官方说明
官方API文档:https://developer.android.google.cn/reference/android/os/Handler
Handler允许您发送和处理与线程的MessageQueue关联的Message和Runnable对象。每个Handler实例都与单个线程和该线程的消息队列相关联。当创建一个新的Handler对象时,它将被绑定到创建他的线程和线程的消息队列,然后Handler将消息传递并添加到消息队列,并在消息队列中处理并执行它们。
Handler有两个主要的功能:
- 安排消息或Runnable在某个主线程中某个地方执行;
- 安排一个动作在不同的线程中执行。
调度消息的方法包括有:
| post(Runnable r) | 将Runnable对象r添加到消息队列中 |
| postAtTime(Runnable r, long uptimeMillis) | 将Runnable对象r添加到消息队列中,并在uptimeMillis设置的时间执行 |
| postDelayed(Runnable r, long delayMillis) | 将Runnable对象r添加到消息队列中,并延时delayMillis后执行 |
| sendEmptyMessage(int what) | 发送空消息,只包含what属性 |
| sendMessage(Message msg) | 将消息添加到正在等待的消息的队列末尾 |
| sendMessageAtTime(Message msg, long uptimeMillis) | 在指定的时间uptimeMillis将消息添加到正在等待的消息的队列末尾 |
| sendMessageDelayed(Message, long) | 在延时delayMillis后将消息添加到正在等待的消息的队列末尾 |
post方法允许将Runnable对象添加到消息队列;而sendMessage方法则将Message对象添回到消息列表,这需要你创建继承Handler的子类,并实现handlerMessage方法。无论是post还是send,当消息队列准备好后你都可以马上处理,也可以在指定时间或延时后处理。
当应用程序进程被创建后,主线程会运行一个消息队列,该消息队列负责管理顶层应用程序对象(Activity,Broadcast receiver等)以及它们创建的任何窗口。您可以创建自己的线程,并通过Handler与主应用程序线程进行通信。同样的,在创建的线程中通过post或sendMessage方法来将消息添加到消息队列,并在适当的时候处理。
Message官方说明
官方API文档:https://developer.android.google.cn/reference/android/os/Message
定义一条可以发送给Handler的消息,消息中包含消息的描述、任意的消息数据对象。Message包含两个int类型和一个Object类型扩展用于装载消息数据。虽然Message的构造方法是public的,但获取消息对象的方法最好是调用Message.obtain()或Handler.obtainMessage()方法,这两个方法会从消息对象池中获取已有的消息对象。
MessageQueue官方说明
官方API文档:https://developer.android.google.cn/reference/android/os/MessageQueue
MessageQueue管理着一个由Looper发送的消息列表,消息不直接添加到MessageQueue,而是通过与Looper关联的Handler对象添加。你可以通过Looper.myQueue()方法获取此线程的MessageQueue对象。
Looper官方说明
官方API文档:https://developer.android.google.cn/reference/android/os/Looper
Looper类用于运行线程的消息循环。默认情况下,线程是没有关联消息循环的,当创建线程时,需要调用Looper.prepare()方法初始化消息循环,然后通过loop()循环处理消息,直至循环被停止。大多数消息循环的交互是通过Handler类实现的。
这是一个Looper线程实现的典型例子,在prepare()和loop()之间创建一个Handler来与Looper进行通信。
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}
Android Handler、Message、MessageQueue和Looper官方说明的更多相关文章
- Android线程之异步消息处理机制(二)——Message、Handler、MessageQueue和Looper
异步消息处理机制解析 Android中的异步消息处理主要有四个部分组成,Message.Handler.MessageQueue和Looper. 1.Message Message是在线程之间传递的消 ...
- 深入源代码解析Android中的Handler,Message,MessageQueue,Looper
本文主要是对Handler和消息循环的实现原理进行源代码分析.假设不熟悉Handler能够參见博文< Android中Handler的使用>,里面对Android为何以引入Handler机 ...
- Android面试题 请解释下单线程模型中Message、Handler、MessageQueue、Looper之间的关系
简单的说,Handler获取当前线程中的looper对象,looper用来存放从MessageQueue中取出的Message,再由Handler进行Message分发和处理,按照先进先出执行. Me ...
- android 消息系统Handler、MessageQueue、Looper源代码学习
android消息系统 总体框架如图所看到的 在安卓的消息系统中,每一个线程有一个Looper,Looper中有一个MessageQueue,Handler向这个队列中投递Message,Looper ...
- 请解释下在单线程模型中Message、Handler、MessageQueue、Looper之间的关系
对于面试,每个职场人士都经历过,面试官更看中你对于技术的理解是否透彻,需要知其所以然,而实际工作中看中的工作效率,都是在使用API的角度来完成任务,当在一家公司呆久了有跳槽的想法时,个人的亲身经历就是 ...
- Android Handler Message总结
http://blog.csdn.net/caesardadi/article/details/8473777 当应用程序启动时,会开启一个主线程(也就是UI线程),由她来管理UI,监听用户点击,来响 ...
- Android Handler Message总结一下
当应用程序启动时,会开启一个主线程(也就是UI线程).由她来管理UI.监听用户点击.来响应用户并分发事件等.所以一般在主线程中不要运行比較耗时的操作,如联网下载数据等,否则出现ANR错误.所以就将这些 ...
- handler message messagequeue详解
long when 应该被处理的时间值,如果是即时发送,即为当前时间,如果是延迟发送则为当前时间+延迟时间
- Android Handler机制彻底梳理
Android的消息机制其实也就是Handler相关的机制,对于它的使用应该熟之又熟了,而对于它的机制的描述在网上也一大堆[比如15年那会在网上抄了一篇https://www.cnblogs.com/ ...
随机推荐
- Navicat 连接Oracle的教程以及注意事项
今天使用Navicat 连接Oracle时晕倒了一些坑,特此记录一下! 楼主就是64位win10系统,安装的Navicat是64位的,刚开始配置32位的oci.配置后连接还是提示“Connot loa ...
- mysql 开发进阶篇系列 51 权限与安全(权限表user,db详细介绍 )
一.概述 mysql 的权限系统主要用来对连接到数据库的用户进行权限验证,以此来判断此用户是否属于合法用户,以及合法用户给予的相应数据库权限.下面将介绍权限系统的工作原理,以及将要熟练掌握账号的管理和 ...
- Linux编程 12 (默认shell环境变量, PATH变量重要讲解)
一 .概述 默认情况下, bash shell会用一些特定的环境变量来定义系统的环境.这些默认环境变量可以理解是上篇所讲的系统全局环境变量. 1.1 bash shell支持的Bourne变量 Bo ...
- Eclipse打包出错——提示GC overhead limit exceeded
版权声明:本文为博主原创文章,未经博主允许不得转载. 在Eclipse开发环境中打包发布apk安装包的时候,有时候会出现下面的错误: 原因 在打包的时候,Eclipse占用的内存会增大,当分配给Ecl ...
- Redis 事物
MULTI . EXEC . DISCARD 和 WATCH 是 Redis 事务的基础. Multi 和 Exec Multi:开启一个事务,它总是返回 OK .执行之后, 客户端可以继续向服务器发 ...
- 禁用feign retryer
为什么要禁用retryer?其实主要是为了Debug,禁用feign retryer有两面性,如果接口做好幂等性,retry不影响,但是总有一些意外发生,比如:有一个实例发生了故障而该情况还没有被服务 ...
- PYTHON 中 SQL 带参数
使用 PYTHON 的字符串填充方式 import mysql.connector sql = 'select \* from school.student where age > {age} ...
- 编码(2)从字节理解Unicode(UTF8/UTF16)
https://www.cnblogs.com/zizifn/p/4716712.html 从字节理解Unicode(UTF8/UTF16) 如果你不知道或者不了解什么是Unicode/UTF8/UT ...
- retry重试常见场景及实现
当我们的代码是有访问网络相关的操作时,比如http请求或者访问远程数据库,经常可能会发生一些错误,有些错误可能重新去发送请求就会成功,本文分析常见可能需要重试的场景,并最后给出python代码实现. ...
- 翻译:delete语句(已提交到MariaDB官方手册)
本文为mariadb官方手册:DELETE语句的译文. 原文:https://mariadb.com/kb/en/delete/ 我提交到MariaDB官方手册的译文:https://mariadb. ...