`
gogoalong
  • 浏览: 49715 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

[Android源码]Message分析

 
阅读更多

一,Message源码分析

首先介绍message使用分析,再介绍Message源码内容分析。本文重点分析,Message类中节省内存的代码设计。

1.1 基本构造方式

创建使用一个对象,最常用最普通的方式为New一个新的对象,Message msg = new Message();通过new 一个新的对象,在内存中保留了该对象的引用消耗了内存空间。

Message源码也建议不通过new一个Message的对象的方式来创建一个新的Message对象。而是使用Message.obtain()的方式来创建。

    /** Constructor (but the preferred way to get a Message is to call {@link #obtain() Message.obtain()}).
    */
    public Message() {
    }

1.2 使用Message.obtain()方式

使用Message msg = Message.obtain();

方式获取msg对象。该方式相比较使用new创建一个新的对象有什么优势呢?

跟踪源码:

    <p class="p1"> <span class="s1">/*package*/</span> Message <span class="s2">next</span>;</p>    private static final Object sPoolSync = new Object();
    private static Message sPool;
    private static int sPoolSize = 0;

    private static final int MAX_POOL_SIZE = 10;
    /**
     * Return a new Message instance from the global pool. Allows us to
     * avoid allocating new objects in many cases.
     */
    public static Message obtain() {
        synchronized (sPoolSync) {
            if (sPool != null) {
                Message m = sPool;
                sPool = m.next;
                m.next = null;
                sPoolSize--;
                return m;
            }
        }
        return new Message();
    }
    /**
     * Return a Message instance to the global pool.  You MUST NOT touch
     * the Message after calling this function -- it has effectively been
     * freed.
     */
    public void recycle() {
        clearForRecycle();// 将Message对象的成员属性赋值为null

        synchronized (sPoolSync) {
            if (sPoolSize < MAX_POOL_SIZE) {
                next = sPool;
                sPool = this;
                sPoolSize++;
            }
        }
    }
Message.obtain函数:有多个obtain函数{Message.obtain(),Message.obtain(what)},主要功能一样,只是参数不一样。作用是从Message Pool中取出一个Message,如果Message Pool中已经没有Message可取,则新建一个Message返回,同时用对应的参数给得到的Message对象赋值。
Message Pool:消息池最大值为10个;消息池为一个链表结构。一个新的消息的添加采用的是头插法。通过Message.mPool->(Message并且Message.next)-> (Message并且Message.next)-> (Message并且Message.next)...构造一个Message Pool。Message Pool的第一个元素直接new出来,然后把Message.mPool(static类的static变量)指向它。其他的元素都是使用完的 Message通过Message的recycle函数清理后放到Message Pool(通过Message Pool最后一个Message的next指向需要回收的Message的方式实现)。下图为Message Pool的结构:

使用Message.obtain()方式构建Message对象与直接分配一个新的对象。在许多情况下,它能避免分配新的对象,减少内存的开支。

1.3 Message成员属性

Message中下面几种参数比较常用:

public int what;// 消息身份标识
public int arg1;// 
public int arg2;// 
public Object obj;// 需要携带的对象参数
Bundle data;// 携带Bundle类型参数
long when;
我们使用Message来封装携带一些需要传递的参数。可以携带基本参数arg1、arg2,可以携带对象obj,可以携带bundle(android最常用的携带数据的容器,类似于Map)。如果我们需要携带的数据类型比较简单,例如只携带int类型数据,可以优先使用Message.arg1和Message.arg2来传递信息,这比用Bundle更省内存。

Demo源码:

public class MainActivity extends Activity  
{
    private final int WHAT = 100;
    private TextView mTextTitle;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextTitle = (TextView) findViewById(R.id.textview1);
        new Thread(runnable).start();
    }
 
    Runnable runnable = new Runnable(){
        @Override
        public void run() {
            int count = 0;
            for (int i = 0; i < 10; i++) {
                count ++;
            }
            Message msg = handler.obtainMessage();
            msg.what = WHAT;
            msg.arg1 = count;
            handler.sendMessage(msg);
        }
    };
    Handler handler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            switch (msg.what) {
                case WHAT:
                    int count = msg.arg1;
                    mTextTitle.setText("总共人数:" + count);
                break;
            }
            return false;
        }
    });
}


至此:Message的分析完毕;

分享到:
评论

相关推荐

    Android系统源码短信收发流程分析

    "Android短信收发流程分析" Android 短信收发流程是 Android 系统源码中一个非常重要的模块,它负责处理短信的发送和接收过程。在这个流程中,涉及到多个组件和类别,包括 ComposeMessageActivity、WorkingMessage...

    进阶android源码demo

    "进阶Android源码demo"提供了一系列的实践项目,包括游戏和聊天应用,为开发者提供了丰富的学习资源。下面,我们将深入探讨这些知识点,以帮助你更好地理解和应用Android源码。 1. **Android框架理解**:Android...

    Android应用源码之HandlerMessage1_HandlerMessage.zip

    总结来说,`Android应用源码之HandlerMessage1_HandlerMessage.zip`中的内容可能展示了如何利用`Handler`、`Message`和`Looper`进行多线程间的通信,以确保UI线程的流畅运行。理解和掌握这一机制对于Android开发者来...

    android的消息处理机制(图+源码分析)——Looper,Handler,Message

    android源码中包含了大量的设计模式, 除此以外, android sdk还精心为我们设计了各种helper类, 对于和我一样渴望水平得到进阶的人来说, 都太值得一读了。 这不, 前几天为了了解android的消息处理机制, 我看 了...

    安卓Android源码——HandlerMessage2.rar

    本资源"安卓Android源码——HandlerMessage2.rar"可能包含了关于`Handler`和`Message`的深入实践和示例代码,下面我们将详细探讨这些核心组件。 `Handler` 是 Android 中用于在线程间传递消息的对象。它通常用于将...

    安卓Android源码——pushMessage.zip

    在安卓(Android)平台上,开发推送消息...以上是对"安卓Android源码——pushMessage.zip"可能涉及的技术点的详细说明,实际源码的分析需要结合具体代码来深入理解。如果你对某个部分有更深入的需求,可以进一步探讨。

    安卓Android源码——HandlerMessage3.rar

    这个压缩包"安卓Android源码——HandlerMessage3.rar"很可能包含了关于这三者如何协同工作的示例代码或者详细分析。现在,我们将深入探讨这些概念及其在Android系统中的作用。 `Handler` 是一个用于发送和处理消息...

    Android源码设计模式

    本文将深入探讨Android源码中的主要设计模式,帮助你提升对Android系统内部机制的理解。 1. **单例模式** (Singleton): 在Android中,单例模式用于确保类只有一个实例,并提供全局访问点。例如,`Application`类...

    android pushMessage源码.rar

    这个“android pushMessage源码.rar”压缩包很可能包含了一个实现Android推送消息功能的示例代码。下面将详细探讨Android推送消息的工作原理、常用服务以及如何通过源码来理解和实现这一功能。 1. **推送消息概述**...

    Android应用源码之AndroidEmail(邮件收发).zip

    通过学习和分析AndroidEmail项目的源码,开发者可以深入了解Android应用中邮件功能的实现细节,提升自己的Android编程技能。此外,还可以根据项目需求进行定制化修改,如添加更多邮件服务提供商的支持,或者优化界面...

    Android源码设计模式解析与实战 pdf高清版

    书中还会详细讨论这些模式如何在实际项目中应用,以及如何通过分析Android源码加深对设计模式的理解。此外,书中可能还会涉及其他设计模式,如享元模式、命令模式等,并提供实战案例,帮助读者将理论知识转化为实践...

    android 源码 (可与eclipse关联)

    在Android开发过程中,深入理解Android源码对于提升开发效率、优化性能和解决复杂问题具有重要意义。"android 源码 (可与eclipse关联)" 提供的源码库允许开发者直接在Eclipse集成开发环境中(IDE)进行查看和研究,...

    android中的Email源码

    Android Email应用支持多种邮件协议,如POP3(Post Office Protocol version 3)用于接收邮件,IMAP4(Internet Message Access Protocol version 4)用于接收和管理邮件,以及SMTP(Simple Mail Transfer Protocol...

    安卓Android源码——pushMessage(2).zip

    在"安卓Android源码——pushMessage(2).zip"这个压缩包中,我们很可能是找到了一个实现推送消息功能的示例代码或框架。下面,我们将深入探讨相关的知识点。 首先,让我们了解推送消息的基本概念。推送消息是移动...

    android.jar 源码

    6. **线程与异步任务**:Android对线程管理有特殊要求,源码中可以看到Handler、Looper和MessageQueue如何协同工作,以及AsyncTask的内部实现。 7. **权限管理**:Android的权限模型是其安全特性的一部分,源码展示...

    Android中Message机制的灵活应用(二)

    在Android系统中,消息传递机制是应用程序中各个组件间通信的重要方式之一,Message机制就是其中的核心组成部分。在本文中,我们将深入探讨“Android中Message机制的灵活应用(二)”这一主题,通过学习如何有效利用...

    安卓Android源码——PushMessage百度的.zip

    这个压缩包“安卓Android源码——PushMessage百度的.zip”很可能是包含了实现百度推送服务(Baidu Push)的源代码。在这里,我们将深入探讨如何理解和使用这样的源代码,以及相关的Android推送技术。 首先,我们...

    安卓Android源码——HandlerMessage1.rar

    在安卓(Android)开发中,`Handler`、`Message` 和 `Looper` 是三个非常重要的组件,它们共同构成了安卓的异步消息处理机制。这个机制是安卓系统中处理UI线程与后台线程通信的核心方式。`HandlerMessage1.rar` 文件...

    Android源码——alertDialog对话框.zip

    本文将深入探讨Android源码中的AlertDialog及其使用方法,旨在帮助开发者更好地理解和自定义对话框。 首先,我们需要了解AlertDialog的基本结构。它是AlertDialog类的一个实例,继承自Dialog。在Android框架中,...

    Android源码——WebViewJS应用源码_new_21.7z

    本资源“Android源码——WebViewJS应用源码_new_21.7z”显然是一个关于如何在Android应用中集成和使用WebView与JavaScript交互的示例代码包。这个压缩包包含了图像资源和源码,帮助开发者深入理解这一功能。 首先,...

Global site tag (gtag.js) - Google Analytics