370 Stimmen

erhält die Ausnahme "IllegalStateException: Kann diese Aktion nach onSaveInstanceState nicht ausführen"

Ich habe eine Live-Android-Anwendung, und aus dem Markt habe ich folgende Stack-Trace erhalten und ich habe keine Ahnung, warum seine geschieht, wie seine nicht in Anwendungscode geschieht, aber seine immer verursacht durch einige oder das andere Ereignis aus der Anwendung (Annahme)

Ich verwende keine Fragmente, dennoch gibt es einen Verweis auf FragmentManager. Wenn jeder Körper kann etwas Licht auf einige versteckte Fakten werfen, um diese Art von Problem zu vermeiden:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1109)
at android.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:399)
at android.app.Activity.onBackPressed(Activity.java:2066)
at android.app.Activity.onKeyDown(Activity.java:1962)
at android.view.KeyEvent.dispatch(KeyEvent.java:2482)
at android.app.Activity.dispatchKeyEvent(Activity.java:2274)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1668)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1720)
at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1258)
at android.app.Activity.dispatchKeyEvent(Activity.java:2269)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1668)
at android.view.ViewRoot.deliverKeyEventPostIme(ViewRoot.java:2851)
at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2824)
at android.view.ViewRoot.handleMessage(ViewRoot.java:2011)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:132)
at android.app.ActivityThread.main(ActivityThread.java:4025)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
at dalvik.system.NativeStart.main(Native Method)

0voto

Antilope Punkte 340

Nun, nach dem Versuch alle oben genannten Lösungen ohne Erfolg (weil im Grunde habe ich nicht Transaktionen).

Auf meinem Fall war ich mit AlertDialogs und ProgressDialog als Fragmente, die manchmal bei der Rotation, wenn Sie für die FragmentManager, der Fehler steigt.

Ich habe eine Abhilfe gefunden, indem ich viele ähnliche Beiträge gemischt habe:

Es ist ein 3-Schritt-Lösung, die alle auf Ihrem FragmentActivity (in diesem Fall, seine GenericActivity genannt) getan:

private static WeakReference<GenericActivity> activity = null; //To avoid bug for fragments: Step 1 of 3

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    //To avoid bug for fragments: Step 2 of 3
    activity = new WeakReference<GenericActivity>(this);
}

@Override
public FragmentManager getSupportFragmentManager(){
    //To avoid bug for fragments: Step 3 of 3
    if (this == activity.get()) {
        return super.getSupportFragmentManager();
    }
    return activity.get().getSupportFragmentManager();
}

0voto

amir ahmadi Punkte 1

Wenn der Zustand eines Fragments oder einer AppCompatActivity mittels onSaveInstanceState() gespeichert wird, wird die Benutzeroberfläche als unveränderlich betrachtet, bis ON_START aufgerufen wird. Der Versuch die UI zu ändern nachdem der Zustand gespeichert wurde, wird wahrscheinlich Inkonsistenzen im Navigationszustand der Anwendung verursachen, weshalb der FragmentManager eine Ausnahme wirft wenn die Anwendung eine FragmentTransaction ausführt nachdem der Zustand gespeichert wurde. Siehe commit() für Details.

LiveData verhindert diesen Grenzfall von vornherein, indem es seinen Beobachter nicht aufruft, wenn der zugehörige Lebenszyklus des Beobachters nicht mindestens STARTED ist. Hinter den Kulissen ruft es isAtLeast() auf, bevor es sich entscheidet, seinen Beobachter aufzurufen.

0voto

Benjamin Dobell Punkte 3872

Dies wurde in Android 4.2 und auch im Quellcode der Support-Bibliothek behoben[*].

Einzelheiten zur Ursache (und Abhilfemaßnahmen) finden Sie im Google-Fehlerbericht: http://code.google.com/p/Android/issues/detail?id=19917

Wenn Sie die Support-Bibliothek verwenden, sollten Sie sich (lange) keine Sorgen über diesen Fehler machen müssen[*]. Wenn Sie jedoch die API direkt verwenden (d.h. nicht den FragmentManager der Support-Bibliothek verwenden) und eine API unter Android 4.2 anvisieren, müssen Sie eine der Umgehungslösungen ausprobieren.

[Zum Zeitpunkt der Erstellung dieses Artikels vertreibt der Android SDK Manager noch eine alte Version, die diesen Fehler aufweist.

編集部 Ich möchte hier etwas klarstellen, denn offensichtlich habe ich denjenigen, der diese Antwort heruntergestimmt hat, etwas verwirrt.

Es gibt mehrere verschiedene (aber verwandte) Umstände, die zum Auslösen dieser Ausnahme führen können . Meine obige Antwort bezieht sich auf den speziellen Fall, der in der Frage angesprochen wurde, d. h. einen Fehler in Android, der inzwischen behoben wurde. Wenn Sie diese Ausnahme aus einem anderen Grund erhalten, liegt es daran, dass Sie Fragmente hinzufügen/entfernen, wenn Sie dies nicht tun sollten (nachdem die Fragmentstatus gespeichert wurden). Wenn Sie sich in einer solchen Situation befinden, sollten Sie vielleicht " Verschachtelte Fragmente - IllegalStateException "Kann diese Aktion nach onSaveInstanceState nicht durchführen" " kann für Sie von Nutzen sein.

0voto

Juan Mendez Punkte 2498

Ich habe etwas sehr Interessantes festgestellt. Ich habe in meiner App die Option, die Galerie des Telefons zu öffnen und das Gerät fragt, welche App zu verwenden, dort klicke ich auf den grauen Bereich weg vom Dialog und sah dieses Problem. Ich habe bemerkt, wie meine Aktivität von onPause, onSaveInstanceState zurück zu onResume geht, es passiert nicht, onCreateView zu besuchen. Ich mache Transaktionen bei onResume. Ich habe also ein Flag gesetzt, das bei onPause negiert wird, aber bei onCreateView wahr ist. Wenn das Flag bei onResume wahr ist, dann mache ich onCommit, sonst commitAllowingStateLoss. Ich könnte noch weiter gehen und so viel Zeit verschwenden, aber ich wollte den Lebenszyklus überprüfen. Ich habe ein Gerät, das sdkversion 23 ist, und ich bekomme dieses Problem nicht, aber ich habe ein anderes, das 21 ist, und dort sehe ich es.

0voto

Murat Punkte 2918

Möglicherweise rufen Sie fragmentManager.popBackStackImmediate(); auf, wenn die Aktivität pausiert. Die Aktivität ist nicht beendet, sondern pausiert und ist nicht im Vordergrund. Sie müssen vor dem Aufruf von popBackStackImmediate() prüfen, ob die Aktivität pausiert oder nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X