目录:
- 消息机制概述
- 消息机制的源码解析
- 总结
一、消息机制概述
1.消息机制的简介
在Android中使用消息机制,我们首先想到的就是Handler。没错,Handler是Android消息机制的上层接口。
Handler的使用过程很简单,通过它可以轻松地将一个任务切换到Handler所在的线程中去执行。
通常情况下,Handler的使用场景就是更新UI。
如下就是使用消息机制的一个简单实例:
public class Activity extends android.app.Activity { private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg){ super.handleMessage(msg); System.out.println(msg.what); } }; public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState){ super.onCreate(savedInstanceState, persistentState); setContentView(R.layout.activity_main); new Thread(new Runnable(){ @Override public void run(){ //...............耗时操作 Message message = Message.obtain(); message.what = 1; mHandler.sendMessage(message); } }).start(); } }
在子线程中,进行耗时操作,执行完操作后,发送消息,通知主线程更新UI。这便是消息机制的典型应用场景。我们通常只会接触到Handler和Message来完成消息机制,其实内部还有两大助手来共同完成消息传递。
2.消息机制的模型
消息机制主要包含:MessageQueue,Handler和Looper这三大部分,以及Message,下面我们一一介绍。
Message:需要传递的消息,可以传递数据。
MessageQueue:消息队列,但是它的内部实现并不是用的队列,实际上是通过一个单链表的数据结构来维护消息列表,因为单链表在插入和删除上比较有优势。主要功能向消息池投递消息(MessageQueue.enqueueMessage)和取走消息池的消息(MessageQueue.next);
Handler:消息辅助类,主要功能向消息池发送各种消息事件(Handler.sendMessage)和处理相应消息事件(Handler.handleMessage);
Looper:不断循环执行(Looper.loop),从MessageQueue中读取消息,按分发机制将消息分发给目标处理者。
3.消息机制的架构
消息机制的运行流程:
在子线程执行完耗时操作,当Handler发送消息时,将会调用MessageQueue.enqueueMessage
,向消息队列中添加消息。当通过Looper.loop
开启循环后,会不断地从线程池中读取消息,即调用MessageQueue.next
,然后调用目标Handler(即发送该消息的Handler)的dispatchMessage
方法传递消息,然后返回到Handler所在线程,目标Handler收到消息,调用handleMessage
方法,接收消息,处理消息。
MessageQueue,Handler和Looper三者之间的关系:
每个线程中只能存在一个Looper,Looper是保存在ThreadLocal中的。主线程(UI线程)已经创建了一个Looper,所以在主线程中不需要再创建Looper,但是在其他线程中需要创建Looper。每个线程中可以有多个Handler,即一个Looper可以处理来自多个Handler的消息。 Looper中维护一个MessageQueue,来维护消息队列,消息队列中的Message可以来自不同的Handler。
下面是消息机制的整体架构图,接下来我们将慢慢解剖整个架构。
从中我们可以看出:
Looper有一个MessageQueue消息队列;
MessageQueue有一组待处理的Message;
Message中记录发送和处理消息的Handler;
Handler中有Looper和MessageQueue。
二、消息机制的源码解析
三、总结
以上便是消息机制的原理,以及从源码角度来解析消息机制的运行过程。可以简单地用下图来理解。
转载自: https://lrh1993.gitbooks.io/android_interview_guide/content/android/basis/message-mechanism.html