gpt4 book ai didi

android - Android 上的 WeakReference 有什么问题吗?

转载 作者:行者123 更新时间:2023-11-30 03:55:24 28 4
gpt4 key购买 nike

我想传递一个 Object throw intent ,但该对象未实现可序列化或可拆分。所以我是这样理解的:

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;
}

但是我发现即使activity结束了,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)”。

最佳答案

在 Java 中,您无法对垃圾回收进行太多控制。即使您调用 System.gc(),您也不能指望垃圾收集器在语句末尾运行。

不过,垃圾回收通常发生在方法的末尾。但是,仍然没有要求它在每个方法上运行。

此外, Activity 完成并不意味着它会立即被垃圾收集。这两件事是完全不同的。例如,如果您保留一个静态字段并将其设置为您的 Activity 实例(这是一个非常糟糕的主意, children 不会那样做!!),该 Activity 将永远不会被垃圾收集..

但在全局范围内,我不明白您要实现的目标。如果您的对象不可分割也不可序列化,那么您就不能在 Intent 中使用它。 Intent 是为了抵抗垃圾收集,它们需要被序列化,它们由 Android 序列化。没有解决方法。

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

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

关于android - Android 上的 WeakReference 有什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13438887/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com