3
我有一個框架佈局,我用它來交換片段。我使用導航抽屜,每個菜單項打開一個片段。所以可以肯定的是,在所有應用程序週期中,屏幕上將會同時出現只有1個片段(因此有1個活動)。下面你可以找到我的片段啓動方法FragmentTransaction,框架容器,釋放片段和內存管理
public void startFragment(Fragment f)
{
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
transaction.replace(R.id.fragment_container, f);
transaction.commit();
}
所以,當我在Android Studio的檢查,每次我更換片段用上述方法,內存使用率增加。 FragmentTransaction.remove
不釋放碎片,replace
也不釋放。所以過了一會兒,如果我點擊每個菜單項並一次又一次打開碎片,內存使用量會增加很多。
所以我的問題是如何釋放舊的替換片段?我只想要記憶中的一個。或者我們可以說;我要消滅他們
「事實上,片段本身被破壞和gc'ed並不意味着你分配的所有資源也被刪除」([1](http://stackoverflow.com/a/18352625/2668136)) - 「發生這種情況因爲具有UI的片段將持有對UI組件[視圖]的引用,並且這些視圖持有活動的上下文的引用「([2](http://stackoverflow.com/a/28834362/2668136)) - 」[活動:一個新的環境,舊的意圖是垃圾收集]現在不能垃圾回收,因爲你的碎片仍然有一箇舊的引用。「 ([3](http://stackoverflow.com/a/13422819/2668136)) – Fllo
@Fllo感謝您的解釋。所以我將分配每個上下文引用變量爲null在每個片段中的ondestroyview –
@Fllo所以我將每個UI元素分配給null,它看起來沒有太大的變化。我改變的是,創建一個名爲mainView的變量,並在onCreateView inflater.inflate中分配。然後在onDestroyView中分配這個變量null它看起來有點不同。我究竟做錯了什麼? –