0

サービスと頻繁に通信するクラスがいくつかあります。メッセージは次を使用して送信されます

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する場合は呼び出す必要があります。onDestroyMessage.obtain

これまでのところ、メモリの問題は発生していませんが、システム リソースをできるだけ効率的に使用したいと考えています。

4

1 に答える 1

1

これはこれに関する私の2cになります:

1) ローカルで宣言する代わりに、クラス メンバー Message mMessage を宣言する必要があります。

JVMがメソッド呼び出しごとにローカル変数のエントリを作成する必要がないように、クラスメンバーが必要です..

2) クラス メンバーとして宣言する場合は、Message コンストラクターを使用するか、Message.obtain を使用する必要があります。

obtain()オブジェクト プーリングを使用するため、常に使用します。

onDestroy3) Message.obtain を使用する場合、クラス メンバーとして recycle を呼び出す必要があります。

nullify.recycle だけを呼び出す必要はありません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

于 2013-04-29T07:32:18.047 に答える