Android_Handler机制

了解Handler消息机制,我们必须先知道“同步”和“异步”通信的差别  

“同步”通信: 类似于打电话,跟同学进行电话对话,我必须等到和小明结束通话之后,才能再拨打其他人的电话 (同步就是发送一个请求之后,什么事都不做,一直等到结果返回后才继续做下面的事情)
  
 "异步"通信: 比如我给几个同学发送E-mail邮件,全部发送过去之后,不需要在这边等他们回复, 我还可以去做别的事情,他们回复的时候,邮箱系统会通知我   (异步就是发出请求之后,这个请求完成之后,通过状态,通知或者回调等方式来通知调用者处理的结果)
 
 Handler机制的产生原因:一个应用程序开启之后,首先会开启一个UI线程(主线程),顾名思义是用来管理界面中UI控件的, 并对事件进行分发,比如一个Button的点击事件,android把事件分发到对应的Button上,来响应用户操作 但由于用户有可能需要做一些耗时的操作(下载文件),但是android如果5秒钟界面没反应的话,就会提示 用户关闭应用程序了,所以这时候需要把这些耗时的操作放在 子线程 中处理,子线程处理完成之后再去更新 UI线程中的界面,而Android的UI线程又是不安全的,这样意味着子线程中无法直接更新UI线程的界面, 因此Android中设计了Handler来解决这个问题!

Handler机制的流程结构图:


分析:handler相关的源代码进行的研究,说到handler机制,就要设计到上面的5个类:Handler、MessageQueue、Looper、Thread、还有一个Message

1、Message是消息:它由MessageQueue统一列队,由Handler处理。

2、Handler是处理者:他负责发送和处理Message消息。

3、MessageQueue指消息队列:它用来存放Handler发送过来的队列,并且按照先入先出的规则执行。

4、Looper的作用就像抽水的水泵:它不断的从MessageQueue中去抽取Message并执行。

5.Thread线程:是消息循环的执行场所。

知道了这几个类就可以说说消息机制的原理了,在创建Activity之前,当系统启动的时候,先加载ActivityThread这个类,在这个类的main函数中,调用Looper.prepareMainLooper()进行初始化Looper对象,然后创建主线程的handler对象,随后才创建ActivityThread对象,最后调用Looper.loop()方法,不断的进行轮询消息队列中的消息。也就是说,在ActivityThread和Activity创建之前,就已经开启了Looper的loop()方法,不断的进行轮询消息。

我们可以通过上面的图来说明handler机制的原理:我们通过Message.obtain()准备消息数据之后;
1、使用sendMessage():通过Handler将消息发送给消息队列;

2、第二步、在发送消息的时候,使用message.target=this为handler发送的message贴上当前handler的标签;

3、开启HandlerThread线程,执行run方法;

4、在HandlerThread类的run方法中开启轮询器进行轮询:调用Looper.loop()方法进行轮询消息队列的消息

5、在消息队列MessageQueue中enqueueMessage(Message msg, long when)方法里,对消息进行入列,即依据传入的时间进行消息入列(排队)

6、轮询消息:与此同时,Looper在不断的轮询消息队列

7、在Looper.loop()方法中,获取到MessageQueue对象后,从中取出消息(Message msg = queue.next()),如果没有消息会堵塞

8、分发消息:从消息队列中取出消息后,调用msg.target.dispatchMessage(msg);进行分发消息

9、将处理好的消息分发给指定的handler处理,即调用了handler的dispatchMessage(msg)方法进行分发消息。

10、在创建handler时,复写的handleMessage方法中进行消息的处理

11、回收消息:在消息使用完毕后,在Looper.loop()方法中调用msg.recycle(),将消息进行回收,即将消息的所有字段恢复为初始状态。

猜你喜欢

转载自blog.csdn.net/tuyerv/article/details/78834096