Android基础-Android消息机制

目录:

  • 消息机制概述
  • 消息机制的源码解析
  • 总结

 

一、消息机制概述

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

posted @ 2019-08-15 18:58  黎先生  阅读(648)  评论(0编辑  收藏  举报