Android中Handler消息机制
Posted yinianzhijian99
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android中Handler消息机制相关的知识,希望对你有一定的参考价值。
作用:跨线程通信。
应用:AsyncTask、retrofit都对Handler进行了封装。
四要素:Message、MessageQueue、Looper、Handler
Message简介:
线程之间传递的消息,常用what和obj变量传递值,用于在不同线程之间交换数据。Message的构造函数是public的,获取Message实例的最好方法是调用Message.obtain()或Handler.obtainMessage(),会从回收对象池中获取对象实例,更节约cpu和内存消耗。
MessageQueue简介:
消息队列,它主要用来存放所有通过Handler发送的消息,等待被处理。Looper负责分发这些message。Messages并不是直接加到一个MessageQueue中,而是通过MessageQueue.IdleHandler关联到Looper。可以通过Looper.myQueue()从当前线程中获取MessageQueue。每个线程中只会有一个MessageQueue对象。
Looper简介:
是每个线程中MessageQueue的管家,调用Looper的loop()方法后,就会进入到一个无限循环当中,每当发现MessageQueue中存在一条消息,就会将其取出传递到Handler的handleMessage()方法当中。默认情况,没有一个消息循环关联到线程。在线程中调用prepare()创建一个Looper,然后用loop()来处理messages,直到循环终止。大多数message、loop的交互是通过Handler。每个线程中只会有一个Looper对象。
Looper消息分发机制:
Handler.sendMessage()发送消息时,会通过MessageQueue.enqueueMessage()向MessageQueue中添加一条消息;
通过Looper.loop()开启循环后,不断轮询调用MessageQueue.next();
调用目标Handler.dispatchMessage()去传递消息,目标Handler收到消息后调用Handler.handlerMessage()处理消息。
Handler简介:
负责Message的发送及处理。通过 Handler.sendMessage() 向消息池发送各种消息事件;通过 Handler.handleMessage() 处理相应的消息事件。
主线程(也就是UI线程)自带一个MessageQueue,这个MessageQueue管理顶层的应用对象(像activities,broadcast receivers等)和主线程创建的窗体。你可以创建自己的线程,并通过一个Handler和主线程进行通信。这和之前一样,通过post和sendmessage来完成,差别在于在哪一个线程中执行这么方法。
以上是关于Android中Handler消息机制的主要内容,如果未能解决你的问题,请参考以下文章