Android - handler(原理简析)
发布日期:2021-05-08 16:16:03 浏览次数:20 分类:精选文章

本文共 1066 字,大约阅读时间需要 3 分钟。

handler是什么?

  • Handler 是一个消息分发对象。handler是Android给我们提供用来更新UI的一套机制,也是一套消息处理机制,我们可以发消息,也可以通过它处理消息。

我们为什么需要handler来处理这种异步线程间的消息?

现在我们假设这样一种情形:

    1. 我们的一个app需要,从网络上下载一张图片
    1. 显示到我们的屏幕上。

此时一个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更加简单

上一篇:Android - 使用Glide加载图片(含Android高版本时不能加载http协议图片解决方案)
下一篇:Android - 动画

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2025年05月05日 13时30分24秒