浅谈Handler机制

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!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值