位置: 编程技术 - 正文

Android消息处理机制:源码剖析Handler、Looper,并实现图片异步加载(安卓消息处理机制)

编辑:rootadmin
引言

推荐整理分享Android消息处理机制:源码剖析Handler、Looper,并实现图片异步加载(安卓消息处理机制),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:android 消息机制,android 消息处理机制,android信息,android 消息队列,android信息,android消息框,android 消息处理机制,android信息,内容如对您有帮助,希望把文章链接给更多的朋友!

我们在做 Android 开发时,常常需要实现异步加载图片/网页/其他。事实上,要实现异步加载,就需要实现线程间通信,而在 Android 中结合使用 Handler、Looper、Message 能够让不同的线程通信,完成异步任务。虽然 Android 官方为我们提供了 AsyncTask 类来完成异步任务,但这个类存在许多问题,并不好用,而且,AsyncTask 也是通过 Handler 和 Thread 来实现异步加载的,所以学习这方面的知识是有必要的

本文讲解思路大致如下:绘制 Android 消息处理机制图 -> 源码剖析消息处理机制中的组件 -> 实现一个图片异步加载 Demo。最终 Demo 效果图如下:

Android 消息处理机制剖析消息处理模型

我们不妨先想想,一个消息处理机制需要什么?当然是:

消息源消息队列消息处理器消息管理器

其中消息管理器又将划分为三个子模块:消息获取、消息分发、消息循环。我们先不管 Android 内部将如何实现消息处理机制(因为处理机制的抽象结构肯定是一样的,只是具体实现不一样),按照我们列出来的4大模块画出一个简单的消息处理模型:

Android 消息处理组件

现在我们已经知道消息处理模型需要哪些组件了,那就去 Android SDK 里面找相应的类吧~然后我们会发现下面四个类:

Message 类代表消息MessageQueue 类代表消息队列Handler 代表消息获取、消息处理Looper 代表消息循环、消息分发Android消息处理机制:源码剖析Handler、Looper,并实现图片异步加载(安卓消息处理机制)

可能有人会怀疑我在吹nb,在骗大家,这个时候我只能选择看源码了……为了方便大家理解,我将从 Looper 类开始分析,因为 Looper 类在消息处理机制中是个“承上启下”的功能模块。

Looper

在解析 Looper 之前,不妨先来想想为什么需要 Looper 吧。

我们在进行 Android 开发的时候,为了不阻塞主线程(UI 线程),常常需要另开一个线程完成一些操作,而这些操作有一些执行一次就完了,有一些可能需要执行几次,几十次,甚至只要程序进程存活就要不断执行该操作。而普通线程通过 start() 方法只能执行相关动作一次,为了满足多次执行的需求,于是有了 Looper。

那么我们就进入 Looper 的源码,看看 Looper 中有哪些成员吧:

大家可以看到,Looper 的核心成员是一个消息队列,该Looper 对应的线程,ThreadLocal 对象,和一个主线程 Looper 的引用。我们根据 Looper 的使用流程来分析它们的作用:

要使用 Looper,就必须调用 Looper 的 prepare() 方法:

我们可以看到,调用 prepare 方法后会通过 ThreadLocal 的 set 方法创建一个 Looper 对象,而且一个线程只能创建一个 Looper,我们不妨看看 ThreadLocal 通过 set 方法对 Looper 对象干了啥:

实际操作 Looper 对象的是 values() 方法返回对象

values() 方法返回的对象是一个线程的内部变量,我们再进去看看会发现:在 Thread 类内部是这样定义 localValues 的 - ThreadLocal.Values localValues。也就是说,set 方法实际完成的操作是,将 Looper 对象与线程绑定,并且该 Looper 对象只在该线程内有效,其他线程无法访问该 Looper 对象。

执行完 prepare() 方法之后,我们就要调用 Looper 的 loop() 方法来实现循环了:

方法有点长,但实际逻辑比较简单:首先判断 prepare() 方法是否被调用,以确保 Looper 和某个线程绑定(需要注意的是:默认情况下,新建的 Looper 对象都与主线程绑定),然后获取对应线程的消息队列,之后就不断循环读取队列中的消息,如果队列中没有消息时 Loop() 方法就会结束(一般不会出现这种情况),否则将消息交给 msg.target 对象分发。

标签: 安卓消息处理机制

本文链接地址:https://www.jiuchutong.com/biancheng/386083.html 转载请保留说明!

上一篇:使用开源库RoundedImageView 创建圆角ImageView以及引用时遇到的问题(什么叫开源库)

下一篇:Android底部tab与标题栏相结合(android底部弹出页面)

  • 工会经费计税依据
  • 公立幼儿园保育员好进吗
  • 小微企业应纳税所得额怎么计算
  • 哪些项目需要交环保税
  • 销售佣金计入什么会计科目
  • 公司账户钱能全部转走吗
  • 有限公司能变更为个体工商户
  • 小微企业免税销售额和未达起征点销售额
  • 分类账和明细账平行登记规则
  • 未分配利润太多说明什么
  • 企业会计做无票收入也要交税吗?
  • 企业更名后账务如何处理
  • 税务系统出问题怎么办
  • 专用发票第一次怎么开
  • 工程结算审计费用谁承担
  • 公允价值变动损益转入其他业务成本
  • 车间固定资产修理费
  • 出售使用过的固定资产如何开票
  • 固定资产折旧率是多少
  • 个人部分公积金可以抵扣个税吗
  • 开票多一分钱怎么办
  • 协会会费计入什么会计科目二级
  • 财政性资金是不含税的吗
  • 如何查出账外收入
  • win10要更新系统
  • 代理进口增值税客户不抵扣,进出口公司可以抵扣吗
  • 收入成本配比原则
  • mac系列电脑
  • 路由器怎么重置网络
  • 收到客户预付的货款的会计分录
  • w11系统安卓
  • 分公司的股东怎么填
  • 微无界是什么软件
  • 其他业务收入是什么意思
  • 深度学习知识点简单概述【更新中】
  • Win11 Build 23430 预览版发布(附更新修复内容汇总)
  • 软件开发服务费开票税目
  • 员工工资为零只缴纳社保,个税怎么处理
  • 公司银行账号注销需要什么资料
  • 列入固定资产的金额标准
  • 在建工程可以核酸无形资产
  • 社保所属期怎么填
  • 商业保险 抵扣个税
  • 有限合伙企业属于企业法人还是非法人企业
  • access数据库如何
  • 代发工资需要缴税吗
  • 外来原始凭证包括一次凭证,累计凭证和汇总凭证
  • 不动产租赁可以享受加计抵减吗
  • 小规模纳税人应交税费的二级科目
  • 其他应收款借方表示增加吗
  • 工程结算属于哪类账户
  • 珠宝行业的会计
  • 小规模纳税人收普票和专票有什么区别
  • 融资租入固定资产的改建支出
  • 前期物业管理阶段的工作有哪些
  • 出口企业样品收入分录
  • 银行承兑到期之前怎么办
  • 公司支付宝账户提现需要手续费吗
  • 4s店出售试驾车账务处理
  • 用友t3固定资产反结账的操作步骤
  • 短期借款明细账采用什么格式
  • 可供出售金融资产和交易性金融资产
  • 销售红酒的公司
  • 核算管理工作
  • 用SELECT... INTO OUTFILE语句导出MySQL数据的教程
  • FNPLicensingService.exe是什么意思
  • win8无线网络连接不上
  • centos6.5查看cpu信息
  • daio.dll 病毒
  • win10麦克风加强没有了
  • koeidsnd.dll
  • cocos 源码
  • js获取url的html
  • unity摄像机在哪里
  • js函数内置函数
  • javascript 日期
  • python xml.etree.ElementTree遍历xml所有节点实例详解
  • jquery的实现原理
  • 增值税号和增值税账号的区别
  • 从印度往中国邮寄药品
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设