1

我想转移一个 Object throw intent ,但该对象没有实现 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;
}

但是我发现即使活动完成了,弱引用中的对象也不会被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(),也不能指望垃圾收集器在语句结束时运行。

通常,垃圾收集发生在方法的末尾。但是,仍然不需要它在每种方法上运行。

此外,正在完成的活动并不意味着它现在将被垃圾收集。这两件事是完全不同的。例如,如果您保留一个静态字段并将其设置为您的活动实例(这是一个非常糟糕的主意,孩子们不要这样做!!),该活动将永远不会被垃圾收集。

但在全球范围内,我不明白你想要实现什么。如果您的对象不可分割也不可序列化,您就不能在意图中使用它。Intent 是用来抵抗垃圾收集的,它们需要被序列化,它们被 Android 序列化。没有解决方法。

此外,意图还被设计为通过进程间通信传递参数,这只能发生,因为它们是完全可序列化的。

真的,你不能用那种方式做你想做的事。如果要在活动之间共享对象,请将其设为可序列化或可打包。另一种选择是将其存储在应用程序类中,因为两个活动都可以使用 getApplication 访问它。

于 2012-11-18T09:30:34.020 回答