Подтвердить что ты не робот

В чем разница между commit() и commitAllowingStateLoss() в фрагментах

Я использовал метод commit в своем проекте, который построил его с фрагментами.

Во всяком случае, иногда я получал ошибку IllegalStateException: Can not perform this action after onSaveInstanceState, и я не мог найти подходящего решения, но только этот метод commitAllowingStateLoss(). Я изменил функцию фиксации на commitAllowingStateLoss(), но не использовал ее для проверки, так может ли эта функция помочь мне? И главный вопрос: в чем разница между commit() и commitAllowingStateLoss()?

4b9b3361

Ответ 1

Существует только одно отличие между commit() и commitAllowingStateLoss(): последнее не генерирует исключение, если происходит потеря состояния. Помимо этого, они имеют одинаковое поведение.

Дополнительную информацию см. в сообщении в блоге об этой теме.

Ответ 2

совершить():

Планирует фиксацию этой транзакции. Фиксация не происходит сразу; это будет запланировано как работа над основным потоком, которая будет выполнена в следующий раз, когда поток будет готов.

commitAllowingStateLoss():

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

Если вы выполните commit() после onSaveInstance(), вы получите исключение ниже:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
    at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1341)
    at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1352)
    at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
    at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)