Android中Handler是一个十分重要的东西,很多时候都需要用到Handler。那什么是Handler呢?又为什么要用Handler呢?

什么是Handler?

我们知道Android更新UI的操作必须放到主线程中来进行,那么问题来了,假如你有现在需要下载一张图片并显示到Activity中,假如这张图片跟大,需要下载很长时间。如果你直接放到Activity主线程中下载,那么会造成页面卡死(因为主线程一直在等下载完图片),我们知道,如果一个页面超过5S没有响应会发生ANR错误,因此你会想到开一个线程去下载图片,那么问题又来了,你下载完图片不能直接更新UI,怎么把你下载图片加载到主线程中呢?Handler就是来解决问题的,Handler是线程间通信传递数据的有力工具。

Handler的用途?

Handler一般有两种用途:1)执行计划任务,你可以再预定的实现执行某些任务,可以模拟定时器。2)线程间通信。在Android的应用启动时,会 创建一个主线程,主线程会创建一个消息队列来处理各种消息。当你创建子线程时,你可以再你的子线程中拿到父线程中创建的Handler对象,就可以通过该 对象向父线程的消息队列发送消息了。由于Android要求在UI线程中更新界面,因此,可以通过该方法在其它线程中更新界面。

Handler运行机制?

Android中有一种消息队列的说法,可以这样理解,如果一个隧道就是消息队列的话,那么进隧道的每一辆汽车,不考虑超车的情况,那么先进隧道的车会先出,公路上的汽车就相当于一个Message,每一辆汽车都有各自的属性,携带了不同的东西,Looper想当于隧道出口的收费站,对每一辆经过隧道的汽车进行识别和处理,最终交给Handler去根据汽车里面携带的东西做不同的处理。这就类似于我们接下来将要说的Handler机制。

(主线程中会自动生成这样的一个消息队列,辅助线程中则没有)

Handler的工作原理?

在使用Handler之前,你必须先明确几个概念:Looper、Thread、Message、MessageQueue和Handler的运行机制。

Handler 工作流程基本包括 Handler、Looper、Message、MessageQueue 四个部分。但我们在日常开发中,经常都只会用到 Handler 和 Message 两个类。

1、Message 负责消息的搭载,里面有个 target 用于标记消息,obj 用于存放内容,Handler 负责消息的分发和处理。
2、Looper:(相当于隧道) 一个线程可以产生一个Looper 对象,由它来管理此线程里的Message Queue( 车队,消息隧道) 。
3、Handler: 你可以构造Handler 对象来与Looper 沟通,以便(Handler)push 新消息到Message Queue 里;或者接收Looper( 从Message Queue 取出) 所送来的消息。
4、Message Queue( 消息队列): 用来存放线程放入的消息。
5、线程:UI thread 通常就是main thread ,而Android 启动程序时会替它建立一个Message Queue 。

每一个线程里可含有一个Looper 对象以及一个MessageQueue 数据结构。在你的应用程序里,可以定义Handler 的子类别来接收Looper 所送出的消息。

Android中Handler、Looper、Message、MessageQueue之间的关系?

Handler、Looper、Message、MessageQueue这四者的关系,用比较通俗的方式解释,可以理解为:Looper是传送带在不停的运送货物,MessageQueue是传送带上面的货物队列,Message就是货物队列中一个一个的货物,而Handler则是货物被消费的地方。

用一张图片来理解

在这里可以把传送带上的货物看做是一个一个Message,而承载这些货物的传送带就是装Message的MessageQueue,传送机依靠滚轮带动起来转动,这里把传送机滚轮看做是Looper,滚轮转动需要电源,这里的Thread用来供电,这里可以看出,所有的消息循环的一切操作都是基于某个线程,一切准备就绪,只需按下电源开关,这里的开关就是Looper.loop();此时Looper就会驱动着消息队列循环起来,那么Handler在整套传送机制中充当什么身份呢?Handler就相当于放入货物或者取出货物的管道(即图中的入口与出口),将货物放入入口管道 相当于调用了handler.sendMessageXXX(),postXXX(),sendEmptyMessageXXX方法

将货物从出口管道取出时,相当于调用了handler.dispatchMessage()方法,该方法中我们完成了对Message的处理。

本篇博客只是简单的介绍的一下Handler,之后会再发布一篇博客对Handler的工作流程进行详解

May everyone be happy every day and everything go well!

浅谈Handler机制相关推荐

  1. 浅谈Attention机制

    浅谈Attention机制 Attention注意机制现在大热,很多深度学习的框架都带上了注意力机制,而且也取得了很好的性能指标.乘着大热也来水一水文章,发表发表自己的看法.事先说明老哥我在NLP上萌 ...

  2. 浅谈Attention机制的作用

    浅谈注意力机制的作用 前言 什么是注意力机制 空间注意力 对于时间步的注意力机制 1.数据集的制作 2.建立注意力模型 3.建立整体神经网络 4.完整代码 5.实验效果 通道注意力机制 前言 Atte ...

  3. 【C#】:浅谈反射机制 【转】

    http://blog.csdn.net/lianjiangwei/article/details/47207875 什么是反射? 反射提供了封装程序集.模块和类型的对象(Type 类型).可以使用反 ...

  4. 系统学习NLP(二十三)--浅谈Attention机制的理解

    转自:https://zhuanlan.zhihu.com/p/35571412 Attentin机制的发家史 Attention机制最早是应用于图像领域的,九几年就被提出来的思想.随着谷歌大佬的一波 ...

  5. java 事件驱动原理_浅谈事件驱动机制

    事件驱动机制是指在持续事务管理过程中,进行决策的一种策略,即跟随当前时间点上出现的事件,调动可用资源,执行相关任务,使不断出现的问题得以解决,防止事务堆积.在计算机编程.公共关系.经济活动等领域均有应 ...

  6. 【GC】浅谈JavaGC机制

    根据对象的生命周期长短,把堆分为3个代:Young,Old和Permanent. 根据不同代的特点采用不同的收集算法,扬长避短. 想要谈GC就避不开Java堆内存机构! Java堆内存结构 Young ...

  7. 【基础整理】attention:浅谈注意力机制与自注意力模型(附键值对注意力 + 多头注意力)

    划水休息两天不看论文了 ~ 来重新复习一下基础qaq 以下讲解参考大名鼎鼎的 nndl 邱锡鹏 <神经网络与深度学习> 部分内容(详见第八章,注意力与外部记忆)是对于不太行的初学者也比较友 ...

  8. android Handler机制之ThreadLocal详解

    概述 我们在谈Handler机制的时候,其实也就是谈Handler.Message.Looper.MessageQueue之间的关系,对于其工作原理我们不做详解(Handler机制详解). Messa ...

  9. 浅谈Android中的Handler机制

    Handler是Android中提供的一种异步回调机制,也可以理解为线程间的消息机制.为了避免ANR,我们通常会把一些耗时操作(比如:网络请求.I/O操作.复杂计算等)放到子线程中去执行,而当子线程需 ...

最新文章

  1. java linux cpu 多核 负载不均匀,系统CPU负载过高、CPU使用率不高的问题
  2. 人工智能之知识图谱-学习笔记
  3. 在什么时候需要使用“常引用”?
  4. js 控制超出字数显示省略号
  5. 写给80后,我们的人生才刚刚开始
  6. Silverlight Gantt甘特图项目管理解决方案
  7. 10套R语言教程+练习题
  8. 夜曲歌词 拼音_《夜曲 - (原唱:周杰伦)》歌词 《夜曲 - (原唱:周杰伦)》LRC歌词?...
  9. BiliDuang(哔哩哔哩视频下载器)
  10. 论文笔记(一)《Intriguing properties of neural networks》
  11. 鸿蒙系统最便宜的手机,鸿蒙手机6月2日上市 手机友商不大可能转投鸿蒙系统
  12. 矩阵的Kronecker积、Khatri-Rao积、Hadamard积
  13. 准备就绪的定义被认为是有害的
  14. 最近在读的一些文章-2019.1
  15. 成为职业游戏建模师有没有前景,未来自己该如何发展学习
  16. HDU 2187汶川地震
  17. HDU 5374 模拟俄罗斯方块
  18. 5G数据安全防护白皮书
  19. web前端基础 html5+css3(十三.移动端)
  20. Simulink —— 三相交流控制系统中的坐标变换

热门文章

  1. oracle 酒店客户数量,浅谈经济型酒店行业的数据分析(二)
  2. 如何掌握“所有”的程序语言?没错,就是所有!
  3. FPGA车牌数字识别系统设计verilog实现(带上板录制视频)
  4. 《c语言从入门到精通》看书笔记——第9章 函数
  5. oracle 查看任务数量,关于dbms_scheduler创建任务数量的疑问
  6. centos7设置成文件服务器,CentOS7服务器架设ftp过程
  7. linux 命令调试分析core文件,linux环境下dump vmcore文件分析
  8. 美登杯”上海市高校大学生程序设计邀请赛 Problem E 、 小 花梨 的数组 (线段树)...
  9. 第4.3节 Python中与迭代相关的函数
  10. 洛谷P3245 [HNOI2016]大数 【莫队】