transaction sirve que para onattach example begintransaction begin addtobackstack android fragmenttransaction

android - sirve - fragmenttransaction example



¿Cómo funciona internamente el nuevo FragmentTransaction commitNow()? (1)

El nuevo método commitNow() agregado en Android N y la versión 24 de la biblioteca de soporte tiene una documentación limitada y un poco confusa.

Confirma esta transacción sincrónicamente. Los fragmentos agregados se inicializarán y se llevarán por completo al estado del ciclo de vida de su host, y los fragmentos eliminados se eliminarán en consecuencia antes de que vuelva esta llamada. Al realizar una transacción de esta manera, se pueden agregar fragmentos como componentes encapsulados y dedicados que monitorean el estado del ciclo de vida de su host al tiempo que proporciona garantías de pedidos más firmes cuando esos fragmentos están completamente inicializados y listos. Los fragmentos que administran vistas tendrán esas vistas creadas y adjuntas.

Llamar a commitNow es preferible a llamar a commit () seguido de FragmentManager.executePendingTransactions () ya que este último tendrá el efecto secundario de intentar confirmar todas las transacciones actualmente pendientes, sea ese el comportamiento deseado o no.

Las transacciones confirmadas de esta manera no se pueden agregar a la pila de respaldo del FragmentManager, ya que al hacerlo se romperían otras garantías de pedido esperadas para otras transacciones confirmadas asincrónicamente. Este método arrojará IllegalStateException si la transacción solicitó previamente que se agregue a la pila posterior con addToBackStack (String) .

Una transacción solo se puede confirmar con este método antes de que su actividad contenga el estado. Si se intenta la confirmación después de ese punto, se lanzará una excepción. Esto se debe a que el estado después de la confirmación puede perderse si la actividad necesita ser restaurada de su estado. Consulte commitAllowingStateLoss () para ver las situaciones en las que puede estar bien perder el compromiso.

He resaltado en negrita la parte que creo que es confusa.

Entonces, mis principales preocupaciones / preguntas son:

1 - NO PUEDEN agregarse? Dice que obtendré una IllegalStateException, ¿se agregará o no?

2 - Acepto el hecho de que no puedo usar esto si queremos agregar un fragmento en el backstack. Lo que no dice es que obtienes esta excepción:

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

!!!! ????

¿Entonces no puedo llamar a addToBackStack(String) porque lo llama internamente por mí? Lo siento pero ... ¿qué? ¿por qué? ¿Qué pasa si no quiero que se agregue en el backstack? ¿Y qué pasa si trato de usar ese fragmento del backstack más tarde pero porque NO PUEDE agregarlo, más tarde no está allí?

Parece que esto es algo esperado si estaba usando commitAllowingStateLoss() , pero veo que commitNowAllowingStateLoss() también existe, así que ... ¿qué tipo de lógica sigue?

TL; DR

¿Cómo funciona commitNow () trabajando internamente con respecto al backstack?


¡Es bueno que el código fuente de Android sea de código abierto cuando nos enfrentamos a una pregunta como esta!

Responder

Así que echemos un vistazo a la fuente BackStackRecord here

@Override public void commitNow() { disallowAddToBackStack(); mManager.execSingleAction(this, false); } @Override public FragmentTransaction disallowAddToBackStack() { if (mAddToBackStack) { throw new IllegalStateException( "This transaction is already being added to the back stack"); } mAllowAddToBackStack = false; return this; }

Y mAddToBackStack se establecerá en verdadero si llama a addToBackStack en su transacción.

Entonces, para responder a su pregunta, no se llama internamente a commitNow() cuando llama a commitNow() , es el mensaje de excepción que es ambiguo. Creo que debería decir You''re not allowed to add to backstack when using commitNow() lugar del mensaje actual.

Prima:

Si profundizamos en el código fuente de FragmentManager here , commitNow() realmente hace casi lo mismo que executePendingTransactions() como se escribió anteriormente, pero en lugar de ejecutar todas las transacciones previamente confirmadas, commitNow () solo confirmará esa transacción.

Creo que esa es la razón principal por la que commitNow () no permite la adición al backstack ya que no puede garantizar que no haya ninguna otra transacción pendiente. Si commitNow () puede agregar al backstack, existe la posibilidad de que podamos romper nuestra secuencia de backstack que conducirá a algo inesperado.