Android中Handler的消息处理
关于Handler机制,能找到无数的文章。http://blog.csdn.net/jiangshitian/article/details/12525313这篇博客写得比较好,关键是图很清晰,结合Handler.java和Looper.java可以对其机制有一个较为清晰的理解,因此不再赘述。这里我只记录一下Handler的消息处理流程,理解该流程对开发会有很大好处。消息处理在dispachMessage函数中,源代码如下:
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
这里要结合Message类、Handler类的结构。Message类有一个callback成员,它是Runnable接口的实例;Handler类有一个成员变量mCallback,它是CallBack接口的实例;另外Handler类通常要重写handleMessage函数,就是我们常用的一种形式。结合上述代码,Handler类在处理消息时,先检查msg的实例是否为空,如果非空,则运行Runnable中的run()函数,处理完毕;否则,检查mCallback是否为空,如果非空,则运行mCallback的handleMessage函数,处理完毕;否则,运行Handler自身的handleMessage函数。
简而言之,dispatchMessage有三个分支,只可能为三个分支中的一种。以前一直不理解Handler中的post系列函数(post,postAtTime,postDelay),其实post系列函数就是设置Message的callback,这样一来,该message就不会运行Handler中重写的handleMessage函数,而是执行callback中的run()。这种设计方式给了我们很大的余地:处理流程可以视情况而定放到不同的地方。比如说,Handler 的Looper是在线程A中,我们在线程B中post了一条消息,那么具体的处理流程就可以在线程B的代码中来写,而不是在Handler的定义处或者线程A中写,这样方便我们引用线程B中的一些变量。不得不佩服该机制的设计人员。
Android中Handler的消息处理的更多相关文章
- Android中Handler的消息处理机制以及源码分析
在实际项目当中,一个很常见的需求场景就是在根据子线程当中的数据去更新ui.我们知道,android中ui是单线程模型的,就是只能在UI线程(也称为主线程)中更新ui.而一些耗时操作,比如数据库,网络请 ...
- Android中Handler 、Thread和Runnable之间的关系
在多线程编程的时候,我们经常会用到Handler,Thread和Runnable这三个类,我们来看看这三个类之间是怎么样的关系? 首先说明Android的CPU分配的最小单元是线程,Handler一般 ...
- Android中Handler使用浅析
1. Handler使用引出 现在作为客户,有这样一个需求,当打开Activity界面时,开始倒计时,倒计时结束后跳转新的界面(思维活跃的朋友可能立马想到如果打开后自动倒计时,就类似于各个APP的欢迎 ...
- Android 中 Handler 引起的内存泄露
在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用.其实这可能导致内存泄露,代码中哪里可能导致内存泄露,又是如何导致内存泄露的呢?那我们就慢慢分析一下.http://w ...
- android中handler用法总结
一.Handler的定义: Handler主要接收子线程发送的数据, 并用此数据配合主线程更新UI,用来跟UI主线程交互用.比如可以用handler发送一个message,然后在handler的线程中 ...
- Android中Handler作用
在Android的UI开发中,我们经常会使用Handler来控制主UI程序的界面变化.有关Handler的作用,我们总结为:与其他线程协同工作,接收其他线程的消息并通过接收到的消息更新主UI线程的内容 ...
- Android中Handler引起的内存泄露
在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用.通常我们的代码会这样实现. 1 2 3 4 5 6 7 8 9 public class SampleActivit ...
- Android中Handler的使用
当我们在处理下载或是其他需要长时间执行的任务时,如果直接把处理函数放Activity的OnCreate或是OnStart中,会导致执行过程中整个Activity无响应,如果时间过长,程序还会挂掉.Ha ...
- Android中Handler的使用方法及实例(基础回顾)
Handler使用例1 这个例子是最简单的介绍handler使用的,是将handler绑定到它所建立的线程中.本次实验完成的功能是:单击Start按钮,程序会开始启动线程,并且线程程序完成后延时1s会 ...
随机推荐
- s3c2440 移值u-boot-2016.03 第2篇 支持Nand flash启动
1, 要求:在4K 的代码以内,完成 NOR NAND 类型判断,初始化 NAND 复制自身到 SDRAM ,重定向. 2, 在 /arch/arm/cpu/arm920t/ 文件夹里 添加一个 in ...
- Proteus 8 画原理图仿真 1602 LCD显示字符
以下是源程序: #include <reg52.h> #include<intrins.h> /** * P2 上接的是 D1 ~ D7 */ sbit RS = P3 ^ ; ...
- win10查看连接过的wifi密码
cmd窗口 运行 “netsh wlan show profiles name="linasd" key=clear”
- AS3语言注意事项汇总
1. 在IE中,主DisplayObject加入stage后,可能其大小还是0,这时可以通过监听resize信息,在主DisplayObject获得正确的大小后,运行主要程序.需要注意的是在这个过程中 ...
- centos7上consul的集群安装
centos7上consul的安装 ###一 下载 下载文件 wget https://releases.hashicorp.com/consul/0.6.4/consul_0.6.4_linux_a ...
- Hibernate <二级缓存>
二级缓存: 定义: 1.二级缓存被称为进程级缓存或者sessionFactory级缓存,二级缓存可以被所有session共享 2.二级缓存的生命周期和sessionFactory生命周期一样(sess ...
- dubbo配置文件xml校验报错
配置dubbo服务xml后,程序能正常执行,但validate会出现一些异常: Multiple annotations found at this line: - cvc-complex-type. ...
- nginx配置文件结构
nginx配置文件结构 全局参数 配置系统全局参数如:worker_processes 工作子进程数量.error_log 错误日志路径.pid 进程IDEvent一般是配置nginx工作模式及连 ...
- Laravel登录验证碰到的坑 哈希验证匹配问题
用laravel 写登录验证 本来是用Crypt加密 添加用户到数据库的 后来验证密码 解密时一直报错 The payload is invaild 由于本人是laravel框架小白 自己思考许久未 ...
- 如何解决EditText使用时,点击外侧系统键盘不消失的bug
在使用viewPager和EditText一起使用的时候,突然出现了一个bug,在点击EditText(此EditText是在ViewPager的Fragment中) 我在切换ViewPager的时候 ...