Я читаю FragmentRetainInstance sample. Существует переменная RetainedFragment mWorkFragment
в UiFragment
. Итак, как можно удалить UiFragment
из памяти после поворота экрана? Насколько я понимаю, mWorkFragment
- это ссылка на то, что сохраняется при поворотах экрана и других изменениях конфигурации.Ссылка на сохраненный фрагмент в фрагменте пользовательского интерфейса. Как удалить фрагмент пользовательского интерфейса из памяти после поворота экрана?
Update # 1
я повернул экран и нажал Инициировать GC, а затем прессуют Dump кучу. Я видел, что число UiFragment
экземпляров было 1. Почему? Я ожидал увидеть 2: 1 для текущей ориентации и 1 для предыдущей ориентации.
Инициировать GC:
дамп кучи:
'UiFragment' не сохраняется. Если он сохранен, он не будет воссоздан, когда будет восстановлена активность хоста, а именно, как работает «Фрагмент # setRetainInstance (...)». Итак, после поворота экрана и инициализации gc, предыдущий экземпляр 'UiFragment' должен быть собран в мусор. –
* Как удалить UiFragment из памяти * - GC начнется с корня GC (который не экземпляр UiFragment не будет), а затем перейдите к его ссылкам (и так далее), чтобы увидеть, какие объекты по-прежнему нужны. Таким образом, ссылка mWorkFragment не является матерью, потому что нет объекта, который долго жил, имея ссылку на экземпляр UiFragment, чтобы сохранить его в живых. – Luksprog
@Luksprog, насколько я понимаю из вашего комментария, GC обходит объекты, начиная с корня (возможно, класс 'Application'), а затем определяет, что' UiFragment' недоступен (после изменения конфигурации нет ссылок). Поэтому его можно удалить. 'UiFragment' является корнем недостижимого поддерева, а' mWorkFragment' является дочерним элементом 'UiFragment'. Если корень недоступен, все его дети недоступны. Правильно? –