2012-08-10 9 views
17

Ich habe ein ernstes Problem mit meiner App auf einigen Nutzer Geräte mit folgenden Ausnahme in einer Aktivität kontinuierlich Absturz onStart Methode:Illegal - Fragment Support-Bibliothek

Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1299) 
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1310) 
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:541) 
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:525) 
at android.support.v4.app.DialogFragment.show(DialogFragment.java:123) 

ich diesen Fehler nicht vor Ort in meinem Emulator wiedergeben kann. Ich habe ein paar Fragen zu diesem Thema auf Stackoverflow gefunden: here und here

ich die vorgeschlagene Lösung versucht habe, das heißt nicht zulassen leere Bündel in onSaveInstance weder in Fragmenten noch Tätigkeiten.

Allerdings bleibt das Problem bestehen. Dies ist der einzige Crash-Bericht, den ich je bekommen habe, und ich bekomme ihn kontinuierlich.

Hat jemand eine funktionierende Lösung?

Antwort

7

Ich habe dieses Problem gelöst, indem

Überprüfen Sie meine Antwort hier für Code: "Can not perform this action after onSaveInstanceState" - why am I getting this exception from my activity's onResume method?

Got nicht mehr Illegal so weit.

4

Ich löste diese this workaround verwenden, nämlich onPostResume() Funktion im Aktivitäts den Code in ein Verfahren setzen

+0

Funktioniert es, irgendwelche Probleme? –

+0

down vote: onPostResume ist nicht verfügbar für android.support.v4.app.Fragment – Loda

+1

@Loda ist es in android.support.v4.app.FragmentActivity, nicht das Fragment – CACuzcatlan

-1

Read This Article.

Und

This one.

Sobald das Problem verstanden wird, gehen Sie voran und Dinge richtig ändern:

Abb warum Ihre Transaktionen außerhalb Ihres OnResume-Status stattfinden. Warum passieren diese Dinge, wenn sie nicht sein sollten? Warum fügen Sie Fragmente manuell hinzu und entfernen sie im Hinblick auf den Lebenszyklus Ihrer App und nicht, wenn der Benutzer sie anfordert? Sie sollten vielleicht einmal in onCreate() oder wenn der Benutzer etwas aufruft. Aber warum tust du sie in onResume() an erster Stelle? Tu das nicht.

Wenn Sie alle .commit() zu .commitAllowStateLoss() ändern, werden die Abstürze verschwinden. Aber es geht Ihnen besser, wenn Sie das nicht tun. Sie sollten besser sicherstellen, dass Sie Ihre Fragmente niemals ändern, außer wenn die App vollständig live ist. Manchmal bedeutet das, dass nie ein Fragment aus OnActivityResult() geladen wird, sondern dass es in onPostResume() ausgeführt wird, und das Ausführen von UI-Änderungen in asynchronen Threads, die fälschlicherweise annehmen, dass Sie die Aktivität in der Zwischenzeit nicht hätten beenden können.

Wenn Sie nur alles spackle wollen, .commitAllowStateLoss() wird das tun. Wenn Sie es richtig machen wollen, stellen Sie sicher, dass Sie nicht mit Ihren Fragmenten herumspielen, nachdem die Dinge gestorben sind.

Eine der neueren Formen von Android um Oreo denke ich, änderte dies, um diesen ärgerlichen Fehler zu vermeiden.Meine Antwort scheint ein bisschen vage, aber es ist, weil der Fehler im Paradigma ist. Sie können das mit verschiedenen Code-Elementen und ziemlich routinemäßig treffen.