一,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应用源码之HandlerMessage1_HandlerMessage
android源码中包含了大量的设计模式, 除此以外, android sdk还精心为我们设计了各种helper类, 对于和我一样渴望水平得到进阶的人来说, 都太值得一读了。 这不, 前几天为了了解android的消息处理机制, 我看 了...
android pushMessage源码.rar
安卓Android源码——pushMessage.zip
安卓Android源码——HandlerMessage1.rar
安卓Android源码——HandlerMessage3.rar
安卓Android源码——HandlerMessage2.rar
安卓Android源码——PushMessage百度的.zip
安卓Android源码——pushMessage (2).zip
安卓Android源码——pushMessage(2).zip
Android应用源码之HandlerMessage3_Android
Android Handler Message源码解析和手写实现
Android应用源码之PushMessage百度的.zip
Android应用源码之HandlerMessage3.zip项目安卓应用源码下载Android应用源码之HandlerMessage3.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考
Android应用源码之HandlerMessage2.zip项目安卓应用源码下载Android应用源码之HandlerMessage2.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考
Android应用源码之HandlerMessage1.zip项目安卓应用源码下载Android应用源码之HandlerMessage1.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考
Android中AsyncTak的使用与源码分析 Android AsyncTask 完全解析,带你从源码的角度彻底理解 Android 异步消息处理机制完全解析,带你从源码角度彻底理解 Android 异步消息处理机制 让你深入理解 Looper、...
消息的类型,在Handler类中的handleMessage方法中得到单个的消息进行处理,在单线程模型下,为了线程通信问题,Android设计了一个Message Queue(消息队列), 线程间可以通过该Message Queue并结合Handler和Looper组件...
Android应用源码之PushMessage百度的.zip项目安卓应用源码下载Android应用源码之PushMessage百度的.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考
安卓Android源码——[安卓开源]PushMessage百度的.zip