Как новый FragmentTransaction commitNow () работает внутри?

НовыйcommitNow () Метод, добавленный в Android N и библиотека поддержки версии 24, имеет ограниченную и немного запутанную документацию.

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

Вызов commitNow предпочтительнее, чем вызов commit (), за которым следует FragmentManager.executePendingTransactions (), так как последний будет иметь побочный эффект при попытке зафиксировать все ожидающие в настоящий момент транзакции, независимо от того, является ли это желаемым поведением или нет.

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

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

Я выделил жирным шрифтом ту часть, которая, по моему мнению, сбивает с толку.

Итак, мои основные проблемы / вопросы:

1 - они НЕ МОГУТ быть добавлены? Он говорит, что я получу IllegalStateException, так будет ли он или не будет добавлен?

2 - Я принимаю тот факт, что я не могу использовать это, если мы хотим добавить фрагмент в backstack. Что это не говорит о том, что вы получаете это исключение:

java.lang.IllegalStateException: This transaction is already being added to the back stack

!!!! ????

Так что я не могу позвонитьaddToBackStack(String) себя, потому что это внутренне вызывает это для меня? Извини но ... что? Зачем? Что делать, если я не хочу, чтобы это было добавлено в backstack? А что если я попытаюсь использовать этот фрагмент из backstack позже, но, поскольку он НЕ МОЖЕТ быть добавлен, позже его там нет?

Похоже, это то, что ожидалось, если бы я использовалcommitAllowingStateLoss()но я вижу чтоcommitNowAllowingStateLoss() также существует, так что ... какая логика следует?

TL; DR

Как commitNow () работает внутренне относительно backstack?

Ответы на вопрос(1)

Ваш ответ на вопрос