尊重原创,转载请注明出处。
Android的消息机制是安卓系统里很重要的一部分,平常我们用Handler来很方便的实现消息的传输与接收,那么具体消息是如何传输的,又是如何接收的,接收后做的事又是什么。
当我们在开发中遇到任务需要实时常驻并且需要根据外部传递的消息来执行不同的操作时(其实就是Handler的作用),我们就要考虑使用异步消息处理线程。
第一步,我们需要创建一个消息队列,即MessageQueue,用来存放外部线程向本线程发来的消息,这个MeaasgeQueue顾名思义内部采用的数据结构即队列,先来先处理。 那么这个MessageQueue是如何创建的呢?这里就要不得不介绍一下Looper这个类,正是Looper内部的prepare()方法中会添加一个新的Looper对象,那么创建新对象时Looper的初始化函数里做了什么呢?
是的,就是在Looper.prepare()里创建了新的Looper对象,从而创建了消息队列。```
第二步,有了消息队列后,我们需要不断的从消息队列里取出消息并且处理它,这一个功能是由Looper.loop()实现的.
可以看出loop()里面:
1.先调用了myLooper()获取了当前线程的Looper()对象。
2.通过while(true)进入无限循环,即不断的从消息队列里取消息,直至消息队列里为空,才会暂停当前的线程。
3.在取完消息后我们看到msg.target.dispatchMessage(msg),这里msg.target即Handler,所以这里是回调Handler里面的handleMessage()对消息进行处理。
4.最后回收该Message对象占用的系统资源。
最后外部的线程就可以通过本线程的Handler向本线程内部发送消息了,而本线程接收消息及处理消息的过程上面已经给出。
总结:
Handler:我们使用Handler向消息队列里发送消息,并重载Handler.handleMessage()方法,在里面实现对消息的处理。
Looper:Looper.prepare()里面创建消息队列,Looper.loop()里面实现循环取消息并回调Handler.handleMessage()来处理消息。
最后,有的人可能会疑惑,为什么平常在Activity里使用Handler都是直接使用,并没有调用Looper.prepare()和Looper.loop()去创建消息队列和处理消息,为什么也用的好好的?那是因为在Activity对象被创建前,Activity所在的线程已经执行了这两个函数,所以在Activity所在线程里你就不需要再去调用了。但是如果你是新建一个线程,那么如果不创建消息队列,则无法实现消息通信。
好了,关于安卓的异步消息处理,就先写到这里,如果文中有写错或表达不准确的地方,欢迎指正,不胜感激。
最后的最后,吃饭去啦!!!!!!!!