80 votes

Comment le nouveau commitNow () de FragmentTransaction fonctionne-t-il en interne?

La nouvelle commitNow() ajout de la méthode d'Android N et le soutien de la bibliothèque de la version 24 a une limite et un peu déroutant de la documentation.

Commet cette opération de manière synchrone. Tout ajout de fragments seront initialisé et porté complètement à l'état de leur cycle de vie animateur et retiré des fragments va être démoli en conséquence avant cet appel retourne. De valider une transaction de cette façon permet fragments d'ajouter, comme dédié, encapsulé composants surveiller le cycle de vie de l'état de leur hôte, tout en fournissant plus ferme des garanties de classement autour de quand ces fragments sont entièrement initialisé et de prêt. Les Fragments de gérer les affichages des vues créées et ci-joint.

L'appel de commitNow est préférable d'appeler commit() suivi par FragmentManager.executePendingTransactions() aura pour effet de bord de la tentative de perpétration de tous actuellement les transactions en attente de savoir si c'est le comportement souhaité ou non.

Les Transactions validées dans cette façon ne peut pas être ajouté à la FragmentManager de la pile de retour, afin d'éviter de casser les autres des garanties de classement pour les autres de manière asynchrone les transactions validées. Cette méthode permettra de jeter l'exception IllegalStateException si la transaction précédemment demandé à être ajouté à la pile de retour avec addToBackStack(Chaîne de caractères).

Une transaction ne peut être commis avec ce méthode avant son contenant de l'activité de l'économie de son état. Si l' la validation est tenté, après ce point, une exception sera levée. C'est parce que l'etat après la validation peut être perdue si l'activité doit être restauré à partir de son état. Voir commitAllowingStateLoss() pour des situations où il peut être bon de perdre le commettre.

J'ai mis en gras la partie qui, je pense, il est source de confusion.

Donc, mes principales préoccupations/questions sont les suivantes:

1 - Ils ne PEUVENT PAS être ajoutés? Il dit que je vais avoir une IllegalStateException, de sorte qu'il sera ou ne sera pas ajouté?

2 - j'accepte le fait que je ne peut pas l'utiliser si nous voulons ajouter un fragment de la backstack. Ce qu'il ne dit pas, c'est que vous bénéficiez de cette exception:

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

!!!!????

Donc je ne peux pas appeler addToBackStack(String) moi-même, car il est à l'intérieur de l'appeler pour moi? Je suis désolé, mais... quoi? pourquoi? que faire si je ne veux pas qu'il soit ajouté dans la backstack? Et si j'essaie d'utiliser ce fragment de la backstack plus tard, mais parce qu'il ne PEUT PAS être ajouté, plus tard, il n'est pas là?

Il semble que ce est quelque chose de prévu si j'ai été en utilisant commitAllowingStateLoss(), mais je vois que commitNowAllowingStateLoss() existe aussi, donc... ce genre de logique-t-il?

TL;DR

Comment est commitNow() de travail à l'interne concernant la backstack?

127voto

Niko Adrianus Yuwono Points 7602

C'est une bonne chose que le code Source Android est Open Source, lorsque nous avons été confrontés à une question de ce genre!

Réponse

Donc, nous allons jeter un oeil à BackStackRecord source ici

@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;
}

Et mAddToBackStack sera définie sur true si vous appelez addToBackStack dans votre transaction.

Donc, pour répondre à votre question, addToBackStack n'est pas appelée en interne lorsque vous appelez commitNow(), C'est le message de l'exception qu'ambiguë. Je pense qu'il devrait dire You're not allowed to add to backstack when using commitNow() au lieu du message en cours.

Bonus:

Si nous creuser plus profondément dans FragmentManager code source ici, commitNow() en train de faire presque la même chose que d' executePendingTransactions() comme écrit ci-dessus, mais au lieu de l'exécution de toutes les anciennes transaction validée, commitNow() ne commit de la transaction.

Je pense que c'est la principale raison pour laquelle commitNow() n'est pas en permettant à plus de la backstack car il ne peut pas garantir qu'il ne sont pas de toute autre transaction en cours. Si commitNow() peut s'ajouter à la backstack, il y a une possibilité que nous pouvons nous débarrasser de nos backstack séquence menant à inattendues chose.

0voto

Bakhshi Points 353

De la documentation commitNow :

Les transactions ainsi commises ne peuvent pas être ajoutées à la pile arrière de FragmentManager, car cela annulerait les autres garanties de commande attendues pour d'autres transactions validées de manière asynchrone. Cette méthode lève IllegalStateException si la transaction précédemment demandée a été ajoutée à la pile arrière avec addToBackStack (String).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X