Фрагменты остаются после того, как Activity get убит и воссоздан

У меня есть FragmentActivity (поддержка фрагментов), где я создаю фрагменты по коду и помещаю их в FrameLayouts. Пока все отлично работает. Теперь, если я покидаю приложение и возвращаюсь, все в порядке, пока система не убивает мою активность (или я делаю это с помощью кнопки остановки в DDMS). Если это произойдет, ничего не вызовут, и моя активность будет уничтожена. ОнДестрой не называется.

Поэтому, когда я снова открываю свое приложение, все фрагменты все еще существуют, и я получаю NullPointerExeptions, потому что они пытаются выполнить свою работу. Фрагменты не должны существовать в этом состоянии приложения, так что это проблема для меня.

Они мне не нужны в backStack, поэтому я не помещаю их туда и не могу вызвать popBackStack(), чтобы избавиться от них.

Как я могу сбросить FragmentManager в onCreate() или просто убедиться, что фрагменты также уничтожены?

4 ответа

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

  • Сохранить состояние фрагмента в onSaveInstanceState
  • Восстановить состояние - пакет сохраненного состояния предоставляется фрагменту несколькими способами ( onCreate, onCreateView и т. Д.)

Если невозможно сохранить состояние фрагмента (из-за того, что его данные являются динамическими и не сериализуемыми), попробуйте реализовать поведение по умолчанию для неинициализированного состояния.

Это на самом деле может быть нормальным. Вместо того, чтобы создавать и уничтожать множество фрагментов, Android может держать их рядом. Это особенно происходит с ViewPager.

Вы используете много вызовов getActivity() или вызовов для получения контекста? Если это так, проверьте null на вызов getActivity(), выполнив что-то такое простое, как:

Activity activity = getActivity();
if ( activity == null )
{
   Log.w("activity null!", "This will cause a crash if you access this variable!");
}

Другой совет - следить за AsyncTasks. Если у вас есть какой-либо из них работает в фоновом режиме, вы хотели бы отслеживать, является ли действие живым или мертвым. Я думаю, что есть проверки жизненного цикла, введенные в более поздние версии Android, но вы также можете сохранить логический флаг для onAttach() и onDetach().

Я знаю, что действительно поздно, но у меня та же проблема, и я нашел ответы здесь

поддержка FragmentPagerAdapter содержит ссылку на старые фрагменты

и здесь

ViewPager и фрагменты - как правильно сохранить состояние фрагмента?

Я предполагаю, что проблема в том, что когда вы создаете действие, вы создаете и сохраняете фрагменты в некотором списке, а не в менеджере фрагментов. Когда действие создается снова, оно также создает фрагмент, но менеджер фрагментов использует фрагмент, который был создан ранее. Таким образом, ваш фрагмент возвращает значение null для getActivity(), потому что этот фрагмент создан перед тем, как поместить приложение в фоновый режим.

Не уверен, что это та же проблема, но некоторое время назад у меня была проблема с фрагментами в окне просмотра, где методы жизненного цикла фрагментов никогда не вызывались, и проблема была с менеджером фрагментов.

Итак, попробуйте использовать childFragmentManager вместо supportFragmentManager и посмотрите, исправит ли это вашу проблему.

Другие вопросы по тегам