Почему clearFindViewByIdCache () должен вызываться в onDestroyView ()? - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь понять расширения Kotlin для Android и эта статья говорит:

When asked for a view, it will try to find it in the cache. If it’s not there, it will find it and add it to the cache. Pretty simple indeed.

Besides, it adds a function to clear the cache: clearFindViewByIdCache. You can use it for instance if you have to rebuild the view, as the old views won't be valid anymore.

Почему старые представления больше не будут действительными, когда вы перестроите представление после onDestroy()?Ссылки на представления по-прежнему будут существовать после перестроения представления, например, в OnActivityCreated ().

1 Ответ

0 голосов
/ 10 апреля 2019

Важно отметить, что фрагменты обычно имеют более длинный жизненный цикл, чем их представления.Давайте рассмотрим следующий поток:

  1. Вы создали Fragment A и поместили его в контейнер
  2. Fragment A представление получено (это onCreateView + onViewCreated)
  3. Вы создали Fragment B и заменили Fragment A новым фрагментом в контейнере + сохраните стек
  4. Fragment A представления будут уничтожены в этот момент, но фрагмент будет сохранен внутри FragmentManager.
  5. Вы back press и Фрагмент B полностью уничтожены, потому что вы логически покидаете это.В этот момент система заменяет его обратно на Fragment A и снова создает новый вид.

Итак, вот несколько важных замечаний:

На шаге# 4 Если вы сохраняете какие-либо ссылки на подпредставления, ваша память просто просачивается, потому что все они уже оторваны от вашей иерархии представлений и больше не могут использоваться.По сути, вы все еще храните все эти представления в памяти, даже если они больше не используются.Обычно, ppl не замечает этого, и все представления снова получают отскок с новым onViewCreated (и findViewById), но расширения kotlin хранят их в кеше и в основном не выполняют этот findViewById снова, поэтому вы можете устареть (читать как мертвые) представления, которые не являются теми видами, которые только что были созданы.

Если вы используете, например, ButterKnife, у них есть описание этого в разделе Binding Reset.(http://jakewharton.github.io/butterknife/#reset).

Последнее важное замечание: расширения Kotlin делают эту работу за вас, поэтому вам не нужно вызывать ее внутри onDestroyView, вы просто используете ее, и она работает (как по волшебству ...)

...