[Android源码]Message分析
来源:互联网 发布:淘宝如何买到烈酒胶囊 编辑:程序博客网 时间:2024/06/03 16:49
一,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; } });}
0 0
- [Android源码]Message分析
- Android源码分析之Message
- Message(Message Pool)源码分析
- Android消息机制源码分析--Lopper,Handler,Message
- Android 消息机制 - Handler, Looper, Message, MessageQueue 的源码分析
- Android开发Message源码分析【享元模式|对象池】
- Android Handler、Looper、MessageQueue以及Message源码分析
- android源码解析--Message
- android源码解析--Message
- AndRoid源码分析----------Handler消息机制(1)Handler获取Message对象及Message的复用
- Mongodb源码分析--消息(message)
- Mongodb源码分析--消息(message)
- Mongodb源码分析--消息(message)
- ZeroMQ源码分析之Message
- Handler-Looper-Message源码分析
- Mongodb源码分析--消息(message)
- Android 8.0系统源码分析--Message发送、处理过程源码分析
- Android的Message Pool是个什么鬼,Message Pool会否引起OOM——源码角度分析
- 2015中国移动游戏市场年度综合报告
- LeetCode Add Two Numbers
- 黑马程序员---IOS基础---switch语句用法
- R 语言 字符串处理常用函数
- 设计模式C++实现(11)——装饰模式
- [Android源码]Message分析
- 一点感悟
- Myeclipse 启动卡死问题解决办法
- 解决windows2012server中80端口被占用
- Spring学习总结
- eclipse 配置运行hadoop 2.7 程序例子参考步骤
- LeetCode_21---Merge Two Sorted Lists
- Android触摸屏事件派发机制详解与源码分析一(View篇)
- 测试博客发布博文