Fragment对象在Fragment被销毁后;当GC收集它们时



我有一个片段,并在该片段内启动一个工作线程,它可以采取几秒钟的事情。在工作线程完成后,我必须通过调用mDatabaseHandler. insertsomething (something)来插入一些东西到sqlite数据库(mDatabaseHandler是片段内部的私有实例)。

在工作线程中,我不访问UI线程创建的任何视图,但我访问在该片段中创建的对象。如果我移走或者毁掉它会怎么样?我读过,当片段被删除onDestroyView被调用。但我不确定其他物体会发生什么。我试图在片段的onDestroy方法中做一些操作:

@Override
public void onDestroy() {
    super.onDestroy();
    Client client = mDatabaseHandler.getTheLastClient();
    Log.e(TAG, "Client full name: " + client.getFullName());
}

一切正常。所以我的最后一个问题是:在fragment被销毁后,GC何时收集在fragment中创建的对象?

当你在片段中保持对对象的引用时。Fragment将不会被垃圾收集,直到线程完成或它释放对Fragment中的对象的引用。如果一个对象有强引用, gc将不会收集它。在你的情况下,你在fragment中保持对对象的引用,因此对fragment对象的隐式引用和内存泄漏(现在垃圾收集器将无法回收被fragment占用的内存)

您应该保留该对象的weak reference,并且在使用该对象时,检查它是否仍然可用(弱引用返回对象或null)。

最新更新