问题描述
这是我非常简单的代码:
class UpdateAlertActivity extends Activity {
O o ;
WeakReference<O> _o ;
ArrayList<O> arr = new ArrayList<>();
static class O {
private String l ;
public O(String l) {
this.l = l ;
}
}
void test()
{
arr.clear();
Runtime.getRuntime().gc();
Log.i(LOG_TAG,"breakpoint");
}
@Override
protected void onResume()
{
super.onResume();
o = new O("hello");
arr.add(o);
_o = new WeakReference<>(o);
test();
}
}
当我在test()
方法中清除数组时,我在断点处将_o.get()
设为null
,但事实并非如此。当我在debbuger中看到o
所在的位置时,它仅在弱引用_o
中显示了我,而我认为在没有其他强引用的情况下,会使用弱引用来释放其实例。 ..
我在StackOverflow上看到我错过了调用GC的记录,但是如您所见,调用它在我的程序中没有任何作用。
编辑: 即使这个超级简单的代码也无法正常运行,这也没有道理...
O o = new O("lol");
WeakReference<O> _o = new WeakReference<>(o);
Log.i(LOG_TAG,"1:" + _o.get().toString());
o = null ;
Log.i(LOG_TAG,"2:" + _o.get().toString());
System.gc();
Log.i(LOG_TAG,"3:" + _o.get().toString()); // output not null here
EDIT2: 我想使用GC,因为在另一个静态类中,有一个名为lastUpdates的数组,该数组有时由服务器通过TCP发送的应用程序更新填充。
我的所有活动都观察到该lastUpdate数组(通过实现Observer / Observable接口),并且在对其进行更改时,将通知所有这些事件,并使用新到达的更新列表作为参数调用特定的函数onUpdate(ArrayList u)。此功能仅在恢复活动后才处理更新(活动睡眠期间更改UI会导致应用崩溃)。
如果整个应用程序正在“休眠”(例如,用户在设备菜单中),我希望仅第一个活动醒来才能处理新更新。
为此,我在活动类中创建了一个数组pendingPersistentUpdates
,该数组存储活动睡眠时已捕获的所有更新的弱引用。当第一个活动唤醒时,在应用程序休眠期间捕获的更新仍在lastUpdates数组中,因此我希望存储在pendingPersistentUpdates
活动道具中的弱引用可以返回实际更新,因此我的活动可以对它们进行UI处理,在onResume
。
我期待着这种情况:
- 活动A跑步,活动B暂停(例如,在活动A后面)
- 应用收到更新U。所有活动(A和B)都将得到通知。因为正在运行更新,所以按预期处理更新。 B已将此更新存储在其
pendingPersistentUpdates
中,因为它已暂停。 - 暂停后,用户返回到B。在暂停时,将清除lastUpdates数组,因此B
pendingPersistentUpdates
中更新的弱引用将返回null - B恢复,但是
pendingPersistentUpdates
个弱引用为空(lastUpdates已被清除),因此未处理U。
但是,由于lastUpdate.clear()不会触发GC,因此B pendingPersistentUpdates
个更新仍然存在,并且需要第二次处理(不希望有这种行为)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)