我应该将Message对象声明为类成员吗?

时间:2013-04-29 06:52:25

标签: android

我有一些经常与服务通信的课程。消息使用

发送
private void sendMessage(int what)
{
    Message msg = Message.obtain(null, what);
    try
    {
        mServerMessenger.send(msg);
    }
    catch (RemoteException e)
    {

    }
}  

我的问题是

  • 我应该声明一个班级成员Message mMessage,而不是在本地声明。

  • 如果我要作为班级成员申报,我应该使用Message constructor 或使用Message.obtain

  • 作为班级成员,如果使用,我需要在recycle中致电onDestroy Message.obtain

到目前为止,我没有遇到任何内存问题,但我希望尽可能高效地使用系统资源。

1 个答案:

答案 0 :(得分:1)

这将是我的2c:

  

1)我应该声明一个类成员Message mMessage而不是   在当地宣布。

我想有一个类成员,以便JVM不必在每次方法调用时为局部变量创建条目。

  

2)如果声明为类成员,我应该使用Message构造函数或   使用Message.obtain。

始终使用obtain(),因为它使用对象池..

  

3)作为班级成员,如果使用,我需要在onDestroy中调用回收   Message.obtain。

您无需仅nullify class variable致电回收。

您可以查看Message.java来源以获取更多信息..

如果我发现更多信息,我也会仔细阅读并更新帖子。

EDIT1:

我再次要求您检查源代码..如果要将对象返回到recycle(),则应调用global object pool方法。调用后不应使用该对象回收方法..复制方法(ICS)以便快速参考:

/**
 * 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();

    synchronized (sPoolSync) {
        if (sPoolSize < MAX_POOL_SIZE) {
            next = sPool;
            sPool = this;
            sPoolSize++;
        }
    }
}

只要您不调用'recyle()',您就可以使用该实例。因此,如果最好在调用代码中的recycle()方法之前调用obtain(),并且在onDestroy()调用recycle()nullify对象..