Добавлен новый метод 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? А что, если я попытаюсь использовать этот фрагмент из бэкстека позже, но, поскольку он НЕ МОЖЕТ быть добавлен, позже его там нет?
Похоже, этого можно было ожидать, если бы я использовал commitAllowingStateLoss()
, но я вижу, что commitNowAllowingStateLoss()
тоже существует, так что ... какой логике это следует?
TL;DR
Как commitNow () внутренне работает с backstack?