Android Handler机制的简介

下面是Handler的官方文档:

Handler是用来结合线程的消息队列来发送、处理“Message对象”和“Runnable对象”的工具。每一个Handler实例之后会关联一个线程和该线程的消息队列。当你创建一个Handler的时候,从这时开始,它就会自动关联到所在的线程/消息队列,然后它就会陆续把Message/Runnalbe分发到消息队列,并在它们出队的时候处理掉。

他主要包括:Looper,MessageQueue,Message,Handler

下面简介一下每一个。

Handler

Handler就是消息处理者,处理子线程发送消息和UI线程发送消息,对Message发送过来的消息进行出路

Looper

每一个线程只有一个Looper,每个线程在初始化Looper之后,然后Looper会维护好该线程的消息队列,用来存放Handler发送的Message,并处理消息队列出队的Message。它的特点是它跟它的线程是绑定的,处理消息也是在Looper所在的线程去处理,所以当我们在主线程创建Handler时,它就会跟主线程唯一的Looper绑定,从而我们使用Handler在子线程发消息时,最终也是在主线程处理,达到了异步的效果。

MessageQueue

MessageQueue是一个消息队列,用来存放Handler发送的消息。每个线程最多只有一个MessageQueue。MessageQueue通常都是由Looper来管理,而主线程创建时,会创建一个默认的Looper对象,而Looper对象的创建,将自动创建一个MessageQueue。其他非主线程,不会自动创建Looper。

Message

消息对象,就是MessageQueue里面存放的对象,一个MessageQueu可以包括多个Message。当我们需要发送一个Message时,我们一般不建议使用new Message()的形式来创建,更推荐使用Message.obtain()来获取Message实例,因为在Message类里面定义了一个消息池,当消息池里存在未使用的消息时,便返回,如果没有未使用的消息,则通过new的方式创建返回,所以使用Message.obtain()的方式来获取实例可以大大减少当有大量Message对象而产生的垃圾回收问题。

按照我自己的理解他们几个的关系是Handler是信息的处理机制,我们把要发送的信息放在Message中,由Hanlder将Message发送出去,发送出去的Messae进入MessageQueue,

而Looper是将MessageQueue中的Message进行循环的发送,Message再次从MessageQueue中出来由Hanlder进行处理。这就是简单的Hanlder机制,下面有一个题简单的介绍图:

 

Handler的主要作用有两个:

  1. 在新启动的线程中发送消息
  2. 在主线程中获取,处理消息

具体的解释当应用程序启动时,Android会首先开启一个主线程(UI线程),主线程来进行相关UI操作,但是当主线程中有相应的耗时操作时,android程序如果五秒内不相应的话,就会发生无法响应状态。所以当如果会发生这样的状态时,此时我们就可以使用Handler,由于Handler运行在主线程中,handler就可以解决这个问题。Handler通过message对象来向子线程中传递数据,因此handler不但可以通过message对象向子线程中发送消息,handler也可以接受由子线程发送过来的消息,在把从子线程发送过来的消息显示到主线程中也就进行了相应的UI更新。

Handler的具体使用:

Handler可以分发Message对象和Runnable对象到主线程中,每个Handler实例都会绑定一个线程(一般为主线程)。

 

首先自己先创建一个新的Handler对象,并实现HandMessage方法,在HandlerMessage方法中显示出来相应的消息,创建一个新的线程,并创建一个新的Message对象,并向Message中写入数值,并在HandlerMessage方法中显示出来。

下面我再来吧Handler来顺一遍,首先我们在主线程中创建了一个Handler,然后我们重写HandlerMessage方法,在HandlerMessage方法中我们可以通过参数msg来写接受消息过后的UI线程的更新,然后我们创建一个新的子线程,在我们子线程需要更新的时候,新建一个Message对象,并向Message对象内部传入我们的数据,比如上面的arg1,arg2等,接着我们在HandlerMessage方法中通过sendMessaga方法将Message对象的实例发送出去,

发送出去的Message先放在MessageQueu中等待调用,此时MessageQueu的Looper在不断的从MessageQueue中取出Message通过回调dispatchMessage方法将消息传递给HandlerMessage方法,最终消息在HandlerMessage方法中进行处理。这就是Handler的简单机制,关于Handler机制的知识还又很多,我知是简单的梳理一下整个机制的流程,关于他的具体应用还要结合具体的实际情况来考虑,我觉得还得从Handler的源码来进行分析他的具体作用,这里就不具体分析了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值