[Android开发从零开始].18.消息处理详解.docx

上传人:飞****2 文档编号:54344072 上传时间:2022-10-28 格式:DOCX 页数:8 大小:1.06MB
返回 下载 相关 举报
[Android开发从零开始].18.消息处理详解.docx_第1页
第1页 / 共8页
[Android开发从零开始].18.消息处理详解.docx_第2页
第2页 / 共8页
点击查看更多>>
资源描述

《[Android开发从零开始].18.消息处理详解.docx》由会员分享,可在线阅读,更多相关《[Android开发从零开始].18.消息处理详解.docx(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、消息处理详解一、为什么需要消息处理?线程之间的交互就需要涉及到消息。二、MessageQueue三、Message解说:消息池:消息池是Android系统默认在应用程序中创建一个消息池。消息池默认是初始化10条消息在池子里面。当通过Message.obtain()与Handler.obtainMessage()方法时,会首先到消息池中有不有可用的Message,如果有,则将Message对象取出来,而不用new一个Message对象。如果没有可用的Message,才用指定的参数创建一个Message对象。Android系统会自动调用removeMessage()方法,会将Message从Mes

2、sageQueue中删除,同时放入到消息不池中。消息队列删除消息放入消息池使用消息。四、Looper创建Looper时,同时会创建一个MessageQueue,Looper是用来操作消息队列的。一个Loper对应的是一个MessageQueue,是一对一的关系,通过Loper.myLoper()方法可以获取当前线程的Loper对象,Loper从MessageQueue中取出Message,然后交给Handler的handlerMessage()这样一个方法进行处理,处理完毕之后,会调用Message.recycle()方法,将这个Message释放到消息池中。五、HandlerHandler可

3、以对应一个Looper和一个MessageQueue。MessageQueue里面有一个死循环,它会中Looper里面有一个死循环,不断的循环MessageQueue,看里面是否有Message,如果有Message的话,它会取出Message,然后根据Message上面的Handler对象的handleMessage()方法对其进行处理。所有的Handler都可以共享同一个Looper与MessageQueue。六、文档解说1、MessageMessage包含一些描述信息,还有一个对象,这个对象包含了一些我们所需要传递的一些参数。有点类似于Intent.put()那样一个方法。注意,在获取M

4、essage的时候尽量不要使用new,而是通过obtain()方法与obtainMessage()方法来获取这个对象。类里面的几个重要参数:int arg1:int arg2:这两个并没有代表什么实际的意义,主要是让我们自己来指定这两个参数来代表是什么意思。一般情况下,我们可以把在Service里面我们知道每个Service都有id的,可以把Service的id赋给这两个参数Object obj:可以放置我们需要传递的对象public Messager replyTo:是将消息指向到某一个new出来的消息上面。int what:仅仅是一个描述信息,根据这个描述信息我们可以判断这个消息是哪一个消

5、息。2、MessageQueueMessageQueue:是用来处理Message的,是通过Looper来调用的。3、LooperLooper:是用来处理线程里面的消息,默认的线程是没有这样一个Looper的,如果我们需要可以调用prepare()方法来给线程添加一个loop,然后调用loop()方法来不断的循环这个Looper。创建一个Looper线程示例:4、HandlerHandler允许你发送和处理消息,还有一些Runnable这样的对象。Handler有两个用处,一个是给messager添加一个计划,用来标名这个messager它是在什么时候开始执行的。另外Handler还可以与其他

6、线程进行交互。执行这个方法会导致系统里面产生两个对象5、梳理执行流程Looper.prepare()一个是Looper()对象一个是MessageQueue()对象接下来调用Looper.loop()方法,得到当前的Looper()对象。再声明一个MessageQueue对象实例指向我们的MessageQueue()对象。在loop()方法里面有一个死循环,它会不断的循环我们的消息队列,Looper looper=Looper.getMainLooper();会给系统产生什么影响呢MessageQueue与咱们的Looper有关联,因此就将Handler的MessageQueue指向了Loop

7、er里面的MessageQueue进行关联。即Looper与Handler产生了关联。ServiceHandler是处理它们的,处理的信息是放在handlerMessage(Message msg)方法里面,因此可以写一个类继承自Handler,然后在HandlerService里面处理我们自己所需要的一些事件。MessageQueue与咱们的Looper有关联,因此就将Handler的MessageQueue指向了Looper里面的MessageQueue进行关联。onCreate()方法执行之后就执行onStartCommand()方法。sendMessage()方法解读:这个Handle

8、r里面的MessageQueue已经与Looper里面的MessageQueu进行了关联,即与Looper里面的MessageQueue指向的是同一个对象,然后判断这个queue是否为空,如果不为空,即这里面它已经存在记录了,则将msg的target指向this,ServiceHander类继承了Hander类,所以它拥有Hander里面所有的方法,而sendMessageAtTime()方法其实也是ServiceHandler里面的方法,而这个this也指向了ServiceHandler对象。回顾一下:首先在onCreate()方法里面执行Looper looper=Looper.getMa

9、inLooper();方法,获取到当前线程的Looper,在这之前会调用Looper.prepare()方法,会创建一个looper对象与一个MessageQueue对象,然后调用一个Loop.loop()方法循环MessageQueue对象,然后不断的取MessageQueue里面的Message,而Message会调用msg.target.dispatchMessage(msg)这样一个方法,而这个target是指向了Handler,而这个dispatchMessage()方法是在Handler里面的这样一个方法,而dispatchMessage()方法又执行了handlerMessage

10、()方法。这也就是以下代码能够导致的一连串作用:由于Handler里面也会用到MessageQueue,所以它将Handler与Looper的MessageQueue相互进行关联,都指向了同一个MessageQueue.最初开始时MessageQueue是为空的,因此在onStartCommand()方法里面,就构建了一个MessageQueue()对象。然后通过sendMessage()方法将它放到队列里面。handler.sendMessage(msg)-handler.sendMessageDelayed(msg, 0);-handler.sendMessageAtTime()-queue.enqueueMessage()通过这一系列方法,最终将消息放在消息队列里面,消息队列里面有消息的话,Loop.loop()里面的死循环就会一直走下去。这个Handler仅仅是在同一个线程里面进行操作的,在Android里面通过Handler还可以在线程与线程之间,进行操作,之后可以通过读API文档进行学习。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁