
Android - handler(原理简析)
发布日期:2021-05-08 16:16:03
浏览次数:20
分类:精选文章
本文共 1066 字,大约阅读时间需要 3 分钟。
handler是什么?
- Handler 是一个消息分发对象。handler是Android给我们提供用来更新UI的一套机制,也是一套消息处理机制,我们可以发消息,也可以通过它处理消息。
我们为什么需要handler来处理这种异步线程间的消息?
现在我们假设这样一种情形:
-
- 我们的一个app需要,从网络上下载一张图片
-
- 显示到我们的屏幕上。
此时一个Android新手上来说,那简单啊,直接写上网络请求获取图片就行了,获取到了再将图片直接放到对应的控件上就行了啊,这有什么值得思考的啊?
报错:
1.ANR
如果这样写就会发现,很可能程序报错ANR(application not response - 程序无响应),原因是主线程中不能执行耗时任务,所有的耗时任务(网络下载,数据库操作等)都要在子线程中执行
。。。。将下载操作放到子线程后。将获取到的图片放到ImageView中时报错2. 子线程不能修改ui
修改ui只能在主(ui)线程中
- 此时,handler就起作用了,将在子线程中获取到的图片发送到主线程中,并且在主线程中修改UI
handler如何处理异步消息的?(原理,好好理解就懂了)
- Handler:包装消息和发送消息的
- Message:包含需要传递的消息的载体
- MessageQueue:主线程管理的消息队列
- Looper:主线程自动创建的轮询器
- 1.我们把需要发送的消息打包成Message对象
- 2.handler将打包好的Message对象发送给Messagequeue保存 - 3.MessageQueue看名字就知道是一个消息队列,由UI线程管理着 - 4.最后Looper一直在轮询,看过源码就知道Looper里面有一个死循环for方法,将MessageQueue中保存的Message对象拿给handleMessage经行处理
如何使用handler传递消息?
使用步骤:
- 1.主线程中创建handler对象
- 2.重写handler中的handleMessage方法
- 3.子线程创建Message对象,将获取的数据绑定到msg对象上
- 4.子线程将msg对象发送给主线程
- 5.主线程在handleMessage方法中修改UI
- 如何使用handler讲得不是很仔细,但理解原理往往更重要,要想更加详细的了解使用的点击这里
悄悄告诉你,,现在在很多时候都可以使用AsyncTask来替代handler,message等较为复杂的机制,但前提是你得会AsyncTask呀,这个其实比handler更加简单
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年05月05日 13时30分24秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Kubernetes 自定义服务的启动顺序
2023-01-29
Java基础:StringBuffer类概念、构造函数、常用方法
2023-01-29
Kubernetes 部署 kubeflow1.7.0
2023-01-29
Java基础:变量(声明、赋值、引用)、基本数据类型、作用域
2023-01-29
Java基础:如何编写并执行入门级别程序 Hello World
2023-01-29
kubernetes 部署SonarQube 7.1 关联LDAP
2023-01-29
Java基础:按位运算符
2023-01-29
Kubernetes 配置管理实战
2023-01-29
Kubernetes 针对资源紧缺处理方式的配置
2023-01-29
Java基础:数组创建、初始化、引用、分类
2023-01-29
Java基础:数组的长度、数组的复制
2023-01-29
Java基础:条件运算符
2023-01-29
Java基础:比较运算符
2023-01-29
Kubernetes 集群卸载清理
2023-01-29
Java基础:运算符优先级
2023-01-29
Kubernetes 高级调度详解
2023-01-29
java备品备件仓库管理系统(源码+开题报告)
2023-01-29
Java复用技术在不同行业项目中的适应性分析与扩展
2023-01-29
kubernetes1.5.2--部署node-problem-detector服务
2023-01-29