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来完成,差别在于在哪一个线程中执行这么方法。

Guess you like

Origin blog.csdn.net/yinianzhijian99/article/details/122377177