В чем разница между commit(), commitNow() и commitAllowingStateLoss()

«В чем разница между commit(), commitNow() и commitAllowingStateLoss()» — вопрос из категории Android компоненты, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

commit() — асинхронное выполнение транзакции. Добавляет операцию в очередь, которая выполнится на главном потоке.

commitNow() — синхронное выполнение транзакции. Немедленно применяет изменения, но работает только с FragmentManager (не FragmentManagerCompat).

commitAllowingStateLoss() — асинхронный аналог commit(), но разрешает потерю состояния (например, если активити уничтожено). Используется, когда потеря UI-состояния допустима.

Пример:

supportFragmentManager.commit {  
    replace(R.id.container, MyFragment())  
    // commit() — асинхронно  
    // commitNow() — синхронно  
    // commitAllowingStateLoss() — с риском потери состояния  
}  

Важно: commitNow() нельзя вызывать после onSaveInstanceState(), а commitAllowingStateLoss() — можно, но с риском.