1

オブジェクト throw インテントを転送したいのですが、オブジェクトが Serializable または parcelable を実装していません。だから私はこのようにそれを実現します:

private static Map<String, WeakReference<Object>> map = new HashMap<String, WeakReference<Object>>();

public static void saveObjectInIntent(Intent intent, String key,
        Object value) {
    String realKey = randomString();
    map.put(realKey, new WeakReference<Object>(value));
    if (intent != null) {
        intent.putExtra(key, realKey);
    }
}

public static Object getObjectFromIntent(Intent intent, String key) {
    String realKey = intent.getStringExtra(key);
    WeakReference<Object> weak = map.get(realKey);
    if (weak != null) {
        return weak.get();
    }
    return null;
}

しかし、アクティビティが終了しても、weakreference のオブジェクトが gc によってリサイクルされないことがわかりました。

だから私はそのようなテストを書きます:

Object obj = new Object();
ObjectTrsnferHelper.saveObjectInIntent(null, "a", obj);
obj = null;

obj もリサイクルされません。

なぜ ?


申し訳ありませんが、問題はありません。しかし、以前にテストコードを間違って書きました。

そのはず :

Set<String> keys = map.keySet();
for (String key : keys) {
    WeakReference<Object> weak = map.get(key);
    if (weak.get() == null) {
        App.log(key + "被清除了");
    }
}

前に「if(weak==null)」と書きました。

4

1 に答える 1

1

Java では、ガベージ コレクションをあまり制御できません。System.gc() を呼び出しても、ステートメントの最後にガベージ コレクターが実行されているとは期待できません。

ただし、通常、ガベージ コレクションはメソッドの最後で発生します。ただし、各メソッドで実行する必要はありません。

また、アクティビティが終了しても、すぐにガベージ コレクションが行われるわけではありません。両方のことはかなり異なります。たとえば、静的フィールドを保持してアクティビティ インスタンスに設定すると (これは非常に悪い考えです。

しかし、世界的には、あなたが何を達成しようとしているのか理解できません。オブジェクトがパーセル可能でもシリアル化可能でもない場合、インテント内で使用することはできません。インテントはガベージ コレクションに抵抗するように作成されており、シリアル化する必要があり、Android によってシリアル化されます。これに対する回避策はありません。

さらに、インテントはプロセス間通信を介してパラメーターを渡すようにも設計されており、完全にシリアライズ可能であるためにのみ発生します。

本当に、その方法を使用してやりたいことを行うことはできません。アクティビティ間でオブジェクトを共有する場合は、シリアライズ可能またはパーセル可能にします。もう 1 つのオプションは、getApplication を使用して両方のアクティビティからアクセスできるため、アプリケーション クラスに格納することです。

于 2012-11-18T09:30:34.020 に答える