Важно отметить, что фрагменты обычно имеют более длинный жизненный цикл, чем их представления.Давайте рассмотрим следующий поток:
- Вы создали
Fragment A
и поместили его в контейнер Fragment A
представление получено (это onCreateView + onViewCreated) - Вы создали
Fragment B
и заменили Fragment A
новым фрагментом в контейнере + сохраните стек Fragment A
представления будут уничтожены в этот момент, но фрагмент будет сохранен внутри FragmentManager
. - Вы
back press
и Фрагмент B полностью уничтожены, потому что вы логически покидаете это.В этот момент система заменяет его обратно на Fragment A
и снова создает новый вид.
Итак, вот несколько важных замечаний:
На шаге# 4 Если вы сохраняете какие-либо ссылки на подпредставления, ваша память просто просачивается, потому что все они уже оторваны от вашей иерархии представлений и больше не могут использоваться.По сути, вы все еще храните все эти представления в памяти, даже если они больше не используются.Обычно, ppl не замечает этого, и все представления снова получают отскок с новым onViewCreated (и findViewById
), но расширения kotlin хранят их в кеше и в основном не выполняют этот findViewById
снова, поэтому вы можете устареть (читать как мертвые) представления, которые не являются теми видами, которые только что были созданы.
Если вы используете, например, ButterKnife, у них есть описание этого в разделе Binding Reset
.(http://jakewharton.github.io/butterknife/#reset).
Последнее важное замечание: расширения Kotlin делают эту работу за вас, поэтому вам не нужно вызывать ее внутри onDestroyView, вы просто используете ее, и она работает (как по волшебству ...)