IllegalStateException: impossible d'exécuter cette action après onSaveInstanceState lors de l'utilisation de DialogFragment

Illegalstateexception



J'ai reçu une question aujourd'hui. Après avoir recherché le journal, j'ai vu le message d'erreur suivant:

AndroidRuntime: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:4) AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1) AndroidRuntime: at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:12) AndroidRuntime: at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:1) AndroidRuntime: at android.support.v4.app.DialogFragment.show(DialogFragment.java:5)

La raison de ce problème est que DialogFragment a un problème lors de l'utilisation de la méthode show (), c'est-à-dire lors de l'exécution du code suivant lors de l'affichage du fragment:






La raison de l'exception est que la méthode commit () est appelée après l'activité onSaveInstanceState (), ce qui provoquera une erreur, car la méthode onSaveInstanceState est appelée pour enregistrer les données d'activité avant que l'activité ne soit sur le point d'être détruite. Si vous y ajoutez Fragment après avoir enregistré l'état, une erreur se produira.
La solution consiste à remplacer la méthode commit () par commitAllowingStateLoss (), l’effet est le même, puis regardez le code source de DialogFragment et je ne trouve pas la méthode show en utilisant commitAllowingStateLoss (), alors que dois-je faire? Fais le?
Pensez-y: pensez-vous pouvoir remplacer la méthode show de la classe parent? Utilisez commitAllowingStateLoss () pour remplacer la méthode commit (). Cependant, j'ai trouvé que la méthode utilise des variables privées, ce qui est embarrassant. Que faire, j'ai tout de suite pensé à utiliser la technologie de réflexion pour modifier les variables privées de la classe parent afin d'assurer la réécriture Après la méthode show, les autres états sont légaux et normaux:
Le code est comme suit:



/** * Override the show() method of the parent class * Avoid java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState */ @Override public void show(FragmentManager manager, String tag) { try { Class cls = this.getClass().getSuperclass() if (cls == null) return Field mDismissed = cls.getDeclaredField('mDismissed') Field mShownByMe = cls.getDeclaredField('mShownByMe') mDismissed.setAccessible(true) mShownByMe.setAccessible(true) mDismissed.setBoolean(this, false) mShownByMe.setBoolean(this, true) } catch (Exception e) { Log.e('DialogFragment', 'show', e.fillInStackTrace()) } FragmentTransaction ft = manager.beginTransaction() ft.add(this, tag) ft.commitAllowingStateLoss() }

Après les tests, aucun autre problème n'a été trouvé jusqu'à présent, tout le monde est invité à signaler les endroits déraisonnables

Pour ajouter, quelqu'un sur Internet a dit qu'après avoir cliqué sur le bouton d'accueil, la méthode onSaveInstanceState () est exécutée avant onPause (), et le résultat de mon test est que la méthode onPause () est exécutée en premier, puis onSaveInstanceState () méthode est exécutée.
—————————————————
Cet article est réimprimé pour votre propre référence, le lien d'origine: https://blog.csdn.net/baidu_28027209/article/details/79740209