2016-01-15 47 views
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也不釋放。所以過了一會兒,如果我點擊每個菜單項並一次又一次打開碎片,內存使用量會增加很多。

所以我的問題是如何釋放舊的替換片段?我只想要記憶中的一個。或者我們可以說;我要消滅他們

+1

「事實上,片段本身被破壞和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

+0

@Fllo感謝您的解釋。所以我將分配每個上下文引用變量爲null在每個片段中的ondestroyview –

+0

@Fllo所以我將每個UI元素分配給null,它看起來沒有太大的變化。我改變的是,創建一個名爲mainView的變量,並在onCreateView inflater.inflate中分配。然後在onDestroyView中分配這個變量null它看起來有點不同。我究竟做錯了什麼? –

回答

1

直到你死的活動,一切以片段的引用將 存在於內存中。無論在 片段管理器級別/ backstack中發生的添加/刪除操作如何。

有由Martín Marconcinithis堆棧溢出的答案看看。

解決方法可以隱藏並顯示它們是否存在於後端堆棧中。 看一下this