У меня есть слушатель в моей деятельности, замените фрагмент после завершения сетевого запроса в другом потоке. Так что слушатель вызова строки кода, как это:Когда использовать FragmentManager.isDestroyed()? Чтобы избежать исключения IllegalStateException?
getFragmentManager().beginTransaction().replace(R.id.container, fragment, fragmentTag).commit();
коммита,() в этой строке кода иногда бросает IllegalStateException. Согласно the docs,
Операция может быть совершена только с использованием этого метода до его сохранения, сохраняя его состояние. Если попытка совершения совершится после этой точки, будет выбрано исключение. Это связано с тем, что состояние после фиксации может быть потеряно, если действие необходимо восстановить из состояния. См. CommitAllowingStateLoss() для ситуаций, когда может быть хорошо потерять фиксацию.
Изучая это, я наткнулся на метод FragmentManager.isDestroyed(). Javadocs читает:
Возвращает true, если заключительный вызов Activity.onDestroy() был выполнен в Activity FragmentManager, поэтому данный экземпляр теперь мертв.
Я предполагаю, что я немного смущен в связи с тем, что экземпляр Activity FragmentManager был мертв. Когда мы должны использовать FragmentManager.isDestroyed()? Проверял бы его перед выполнением замены FragmentTransaction, избегая исключения IllegalStateException?
Вы должны опубликовать свою ошибку LogCat –
я испытывал то же самое ... и я считаю, что это совершенно верно: во всех моих случаях, когда FragmentManager.isDestroyed() возвращает значение ИСТИНА, в FragmentTransaction.commit () выкинет исключение IllegalStateException. В самом деле, первая проверка .isDestroyed() поможет вам избежать исключения, но вы также не получите транзакцию с фрагментами. – alpartis
@alpartis Я добавлю несколько лучших протоколов и посмотрю, вернет ли FragmentManager.isDestroyed() true, когда я получу исключение IllegalStateException. Ваш комментарий кажется достаточно хорошим, чтобы быть ответом. Если вы опубликуете его как один, и никто не опубликует лучшего, я приму его. – pumpkinpie65