Como o novo FragmentTransaction commitNow () está funcionando internamente?
O novocommitNow () O método adicionado no Android N e na biblioteca de suporte versão 24 possui uma documentação limitada e um pouco confusa.
Confirma esta transação de forma síncrona. Quaisquer fragmentos adicionados serão inicializados e trazidos completamente para o estado do ciclo de vida de seu host, e quaisquer fragmentos removidos serão removidos adequadamente antes que essa chamada retorne. A confirmação de uma transação dessa maneira permite que os fragmentos sejam adicionados como componentes encapsulados dedicados que monitoram o estado do ciclo de vida de seu host, fornecendo garantias de pedidos mais firmes quando esses fragmentos estão totalmente inicializados e prontos. Fragmentos que gerenciam visualizações terão essas visualizações criadas e anexadas.
Chamar commitNow é preferível a chamar commit () seguido por FragmentManager.executePendingTransactions (), pois o último terá o efeito colateral de tentar confirmar todas as transações pendentes atualmente, seja esse o comportamento desejado ou não.
As transações confirmadas dessa maneira podem não ser adicionadas à pilha traseira do FragmentManager, pois isso quebraria outras garantias de pedidos esperadas para outras transações confirmadas de forma assíncrona. Este método lançará IllegalStateException se a transação anteriormente solicitada para ser adicionada à pilha traseira com addToBackStack (String).
Uma transação só pode ser confirmada com esse método antes da atividade que contém o salvamento de seu estado. Se a confirmação for tentada após esse ponto, uma exceção será lançada. Isso ocorre porque o estado após a confirmação pode ser perdido se a atividade precisar ser restaurada a partir do estado. Consulte commitAllowingStateLoss () para situações em que pode ser bom perder a confirmação.
Destaquei em negrito a parte que acho confusa.
Portanto, minhas principais preocupações / perguntas são:
1 - Eles NÃO PODEM ser adicionados? Ele diz que vou receber uma IllegalStateException, então será ou não será adicionado?
2 - Aceito o fato de que não posso usar isso se queremos adicionar um fragmento no backstack. O que não diz é que você recebe essa exceção:
java.lang.IllegalStateException: This transaction is already being added to the back stack
!!!! ????
Então eu não posso ligaraddToBackStack(String)
eu mesmo porque está chamando isso internamente para mim? Me desculpe, mas ... o que? porque? e se eu não quiser que ele seja adicionado no backstack? E se eu tentar usar esse fragmento do backstack mais tarde, mas porque NÃO PODE ser adicionado, depois não estará lá?
Parece que isso é algo esperado se eu estivesse usandocommitAllowingStateLoss()
mas eu vejo issocommitNowAllowingStateLoss()
também existe, então ... que tipo de lógica ela segue?
TL; DR
Como o commitNow () está trabalhando internamente em relação ao backstack?