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