1

我有一个片段,并在该片段中,我开始一个工作线程,它可以执行一些可能需要几秒钟的工作。工作线程完成后,我必须通过调用mDatabaseHandler.insertSomething(something)(mDatabaseHandler是片段中的私有实例)将某些内容插入sqlite数据库。碎片后的碎片被破坏; GC收集它们时?

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

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

一切工作正常。所以我最后的问题是:什么时候GC会收集片段被销毁后在片段中创建的对象?

回答

0

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

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

你可以阅读更多关于弱引用here