Является ли метод commit у FragmentManager синхронным

Ответ

Да, метод commit() у FragmentManager является асинхронным по умолчанию. Он добавляет транзакцию в очередь и выполняет её при первой возможности, но не сразу.

Если нужно синхронное выполнение, можно использовать commitNow() (доступен с API 24) или executePendingTransactions() для принудительного выполнения.

Пример:

supportFragmentManager.beginTransaction()
    .replace(R.id.container, MyFragment())
    .commitNow() // Синхронное выполнение

⚠️ commitNow() нельзя использовать после onSaveInstanceState(), иначе будет IllegalStateException.

Ответ 18+ 🔞

А, ну это классика, ёпта! Смотри, тут история про FragmentManager.commit() — она как тот твой друг, который всегда говорит "сделаю завтра", а потом вспоминает через неделю.

Так вот, этот метод commit() — он по умолчанию асинхронный, как будто в очередь встал за бесплатным сыром. Кинул транзакцию в список дел и пошёл дальше пиво пить. Выполнится, когда система соизволит, а не когда тебе срочно надо.

А если тебе прям щас, вот прямо в эту секунду, без всяких "может быть", то есть два варианта, чувак.

Первый — commitNow(). Это как крикнуть "быстро сделал, я жду!". Работает с API 24. Но с ним осторожно: если позвать его после onSaveInstanceState() — получишь IllegalStateException прямо в лицо, будто наступил на грабли. Терпения ноль ебать, он тебя сразу в ошибку отправит.

Второй вариант — старый добрый executePendingTransactions(). Это как взять того же друга за шкирку и сказать: "А ну-ка, быстро всё, что наобещал!". Заставит систему выполнить всё, что в очереди висит.

Вот тебе пример, как этим пользоваться:

supportFragmentManager.beginTransaction()
    .replace(R.id.container, MyFragment())
    .commitNow() // Вжух — и сразу сделано, синхронно, без дураков

Короче, запомни: обычный commit() — это "сделаю, когда будет время", а commitNow() — это "ёбать копать, делай сейчас, я смотрю". Выбирай по ситуации, только не облажайся с состоянием активити, а то будет тебе хиросима, а не фрагмент.