zoukankan      html  css  js  c++  java
  • 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

    很想高飞,但我不能;不想天空,剩我一人。
  • 相关阅读:
    Hadoop伪分布式环境安装
    记一次Xshell配置ssh免密登录时的问题
    HDFS学习笔记二
    HDFS学习笔记一
    十万级百万级数据量的Excel文件导入并写入数据库
    javascript内置对象:Date
    内置对象:Math
    javascript内置对象一:String
    javascript内置对象一: Array数组
    Javascritp 数据结构和二叉树算法
  • 原文地址:https://www.cnblogs.com/lixiansheng/p/11359876.html
Copyright © 2011-2022 走看看