Java /弱引用:弱引用.get不为null,而没有其他更强的引用将其保存

问题描述

这是我非常简单的代码:

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 (将#修改为@)