IllegalStateException-библиотека поддержки фрагментов


У меня есть серьезная проблема с моим приложением, постоянно зависающим на некоторых устройствах пользователей со следующим исключением в методе Activity onStart:

Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1299)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1310)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:541)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:525)
at android.support.v4.app.DialogFragment.show(DialogFragment.java:123) 

Я не могу воспроизвести эту ошибку локально в моем эмуляторе. Я нашел несколько вопросов, касающихся этой проблемы на stackoverflow: здесь и здесь

Я попробовал предложенное решение, т. е. не допускайте пустых расслоений в onSaveInstance ни во фрагментах, ни в действиях.

Однако проблема остатки. Это единственный отчет об аварии, который я когда-либо получал, и я получаю его постоянно.

Есть ли у кого-нибудь рабочее решение?

3 19

3 ответа:

Я решил эту проблему с помощью

  • Обновление моей библиотеки поддержки до версии 10
  • используя обходной путь, опубликованный здесь: http://code.google.com/p/android/issues/detail?id=23096 т.е.. Добавьте фрагмент, не относящийся к пользовательскому интерфейсу, в onResumeFragments и вызовите дальнейшие транзакции в обратном вызове прослушивателя.

Проверьте мой ответ здесь для кода: "не могу выполнить это действие после onSaveInstanceState" - почему я получаю это исключение из onResume моей деятельности метод?

До сих пор не получил больше IllegalStateException.

Я решил это, используя этот обходной путь, а именно поместил код в функцию методов onPostResume() в действии

Прочтите Эту Статью.

И,

Вот этот.

Как только проблема будет понята, продолжайте и измените вещи должным образом:

Выясните, почему ваши транзакции происходят вне вашего состояния onResume. Почему все это происходит, когда не должно происходить? Почему вы вручную добавляете и удаляете фрагменты, относящиеся к жизненному циклу вашего приложения, а не когда пользователь запрашивает. Возможно, Вам понадобится один раз в onCreate() или когда пользователь вызывает что-то. Но почему вы связались с ними в onResume() в первую очередь? Не делай этого.

Если вы измените все .commit() на .commitAllowStateLoss(), то сбои исчезнут. Но тебе лучше этого не делать. Вам лучше убедиться, что вы никогда не меняете свои фрагменты, кроме тех случаев, когда приложение полностью работает. Иногда это означает, что вы никогда не загружаете фрагмент из OnActivityResult (), а вместо этого помечаете его для запуска в onPostResume () и избегаете выполнения изменений пользовательского интерфейса в асинхронных потоках это ошибочно предположить, что вы не могли убить активность в то же время.

Если вы просто хотите заклеить все, .commitAllowStateLoss() сделает это. Если вы хотите сделать это правильно, убедитесь, что вы не возитесь со своими фрагментами после того, как вещи умирают.

Одна из более поздних форм Android circa Oreo, я думаю, изменила это, чтобы избежать этой досадной ошибки. Мой ответ кажется немного расплывчатым, но это потому, что ошибка находится в парадигме. Вы полностью можете поразить это различными элементами кода и довольно обычно.