1

Я использую фрагменты в своем приложении, и у меня есть сомнения в том, что каждый раз добавляя и удаляя фрагмент, есть ли сборщик фрагментов, когда вы его удаляете?Фрагменты Сбор мусора

Вот мой код:

в OnCreate()

FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
fragmentTransaction.add(detailFragmentID, new MyDetailFragment()); 
fragmentTransaction.add(fragmentID, new MyListFragmentt()); 
fragmentTransaction.commit(); 

в onRestart()

FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
Fragment previousFragment = getSupportFragmentManager().findFragmentById(detailFragmentID); 
if (previousFragment != null) { 
    fragmentTransaction.remove(previousFragment); 
} 
fragmentTransaction.add(detailFragmentID, new MyDetailFragment()); 
fragmentTransaction.commitAllowingStateLoss(); 

Вот когда я иду к какой-либо деятельности и вернуться onRestart будет называться.

путем добавления и удаления фрагментов каждый раз, есть ли фрагмент мусора здесь?

[отформатированный код правильно]

ответ

0

GC будет работать на своем собственном графике, если вы специально не называйте finalize() метод на некотором Object. Итак, я думаю, что вам не нужно беспокоиться о GC здесь, когда вы удаляете Fragment.

0

Сбор мусора автоматически собирает объекты, когда есть потребность в некоторых ресурсах и будет собирать ресурсы, которые остаются неиспользованными в памяти.

Удаление метода Fragments с использованием метода удаления приведет только к удалению фрагмента из его стека не из памяти. Вы не можете быть уверены, что GC удалит его из памяти по мере удаления метода Fragment.

Таким образом, добавляя и удаляя Fragment каждый раз, вы не можете сказать, что он всегда будет GC из памяти.

0

Было бы трудно узнать, было ли это GC'd. Я думаю, что вы действительно спрашиваете, есть ли Фрагмент с пометкой для GC (т. Е. Он получит GC'd позже).

Самый простой способ проверить это - поставить точку останова в методе onDestroy() вашего фрагмента и посмотреть, вызвано ли это вызовом. Вы можете быть уверены, что если система «уничтожит» ваш фрагмент, он в конечном итоге получит GC'd.

+1

Это последнее утверждение не совсем верно, не так ли? Как только onDestroy() вызывается, но «это» фрагмента остается ссылкой где-то Фрагмент не будет GC'd. источник: http://blog.nimbledroid.com/2016/05/23/memory-leaks.html – Voy

+0

@Voy вы абсолютно правы. Я уточню свой ответ. – tir38