2

公式の Android FAQからの次の提案に特に興味があります。

オブジェクトへの WeakReferences の HashMap

長いキーを持つオブジェクトへの WeakReferences の HashMap を使用することもできます。アクティビティがオブジェクトを別のアクティビティに渡したい場合、オブジェクトをマップに配置し、インテント エクストラを介して受信側アクティビティにキー (カウンターまたはタイム スタンプに基づく一意の Long) を送信するだけです。受信者アクティビティは、このキーを使用してオブジェクトを取得します。

これを適切に実装する方法が見つかりませんでした。ここで WeakReferences が好まれる理由と、ハード参照を使用しない理由がわかりません。

私の実装(クラス XYのインスタンスをアクティビティ Aからサービス Bに送信したい):

  • 受信サービスには、オブジェクトの静的 HashMap があります。

    public static HashMap<Long, Object> parameters = new HashMap<Long, Object>();
    
  • 送信部分のコード (アクティビティ A)

    long key = SystemClock.elapsedRealtime();
    B.parameters.put(key, new XY());
    Intent i = new Intent(this, B.class);
    i.putExtra("PARAM_UPLOAD", key);
    startService(i);
    
  • 受信側のコード (サービス B)

    long key = intent.getLongExtra("PARAM_UPLOAD", -1);
    XY data = (XY)parameters.get(key);
    

コードはハード参照を使用しています。ここで弱参照を使用する必要があるのはなぜですか (FAQ で提案されているように)。そして、データを渡すためのそのような使用パターンは大丈夫ですか、それとも他のものを好みますか。

4

1 に答える 1

5

ここで弱参照を使用する必要があるのはなぜですか (FAQ で提案されているように)。

あなたがメモリをリークしているからです。その static に入れたものHashMapは、決してガベージ コレクションされません。

そして、データを渡すためのそのような使用パターンは大丈夫ですか、それとも他のものを好みますか。

アクティビティ間で単純なデータのみを渡すことを好みます。プリミティブ (または のParcelableようなシステム提供のPendingIntent) でないものはすべて、データ モデルの一部と見なし、そのように管理する必要があります。詳細については、こちらのブログ記事を参照してください。

于 2010-11-11T13:57:56.083 に答える