片段被破坏后的片段对象;当GC收集它们?

时间:2016-11-17 16:19:35

标签: java android multithreading android-fragments garbage-collection

我有一个片段,在该片段中我启动了一个工作线程,这可能需要几秒钟。工作线程完成后,我必须通过调用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());
}

一切都很好。所以我的最后一个问题是:在片段被销毁之后,GC何时会收集片段中创建的对象?

1 个答案:

答案 0 :(得分:0)

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

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

您可以阅读有关弱引用here的更多信息。