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)

4voto

mc.dev Punkte 2605

Meine Lösung für dieses Problem war

Im Fragment Methoden hinzufügen:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    ...
    guideMapFragment = (SupportMapFragment)a.getSupportFragmentManager().findFragmentById(R.id.guideMap);
    guideMap = guideMapFragment.getMap();
    ...
}

@Override
public void onDestroyView() {
    SherlockFragmentActivity a = getSherlockActivity();
    if (a != null && guideMapFragment != null) {
        try {
            Log.i(LOGTAG, "Removing map fragment");
            a.getSupportFragmentManager().beginTransaction().remove(guideMapFragment).commit();
            guideMapFragment = null;
        } catch(IllegalStateException e) {
            Log.i(LOGTAG, "IllegalStateException on exit");
        }
    }
    super.onDestroyView();
}

Das mag schlecht sein, aber ich konnte nichts Besseres finden.

4voto

Ich hatte das gleiche Problem und bekam IllegalStateException, aber das Ersetzen aller meiner Aufrufe von commit() durch commitAllowingStateLoss() hat nicht geholfen.

Der Schuldige war ein Aufruf von DialogFragment.show().

Ich umgebe sie mit

try {
    dialog.show(transaction, "blah blah");
}
catch(IllegalStateException e) {
    return;
}

und das war's. OK, ich kann den Dialog nicht zeigen, aber in diesem Fall war das in Ordnung.

Es war die einzige Stelle in meiner Anwendung, an der ich zuerst FragmentManager.beginTransaction(), aber nie commit() aufgerufen habe, so dass ich sie nicht gefunden habe, als ich nach "commit()" suchte.

Das Lustige daran ist, dass der Nutzer die App nie verlässt. Stattdessen war der Killer eine AdMob-Interstitial-Werbung, die angezeigt wurde.

4voto

Peter Punkte 478

Ich habe das gleiche Problem in meiner App. Ich habe dieses Problem gelöst, indem ich die super.onBackPressed(); auf die vorherige Klasse und den Aufruf der commitAllowingStateLoss() auf die aktuelle Klasse mit diesem Fragment.

4voto

oO_ox Punkte 41

Ich habe dieses Problem, aber ich denke, dieses Problem ist nicht mit commit und commitAllowStateLoss verbunden.

Der folgende Stack-Trace und die Ausnahmemeldung beziehen sich auf commit().

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1341)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1352)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)

Aber diese Ausnahme wurde durch onBackPressed() verursacht

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(Unknown Source)
at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(Unknown Source)
at android.support.v4.app.FragmentActivity.onBackPressed(Unknown Source)

Sie wurden alle durch checkStateLoss() verursacht.

private void checkStateLoss() {
    if (mStateSaved) {
        throw new IllegalStateException(
                "Can not perform this action after onSaveInstanceState");
    }
    if (mNoTransactionsBecause != null) {
        throw new IllegalStateException(
                "Can not perform this action inside of " + mNoTransactionsBecause);
    }

mStateSaved wird nach onSaveInstanceState auf true gesetzt.

Dieses Problem tritt nur selten auf, ich bin noch nie auf dieses Problem gestoßen und kann es nicht wiederholen.

Ich fand Ausgabe 25517

Dies könnte unter folgenden Umständen geschehen sein

  1. Back key wird nach onSaveInstanceState, aber vor dem Start der neuen Aktivität aufgerufen.

  2. onStop() im Code verwenden

Ich bin mir nicht sicher, was die Ursache des Problems ist. Also habe ich einen hässlichen Weg gewählt.

@Override
public void onBackPressed() {

    try{
        super.onBackPressed();
    }catch (IllegalStateException e){
        // can output some information here
        finish();
    }
}

3voto

dols Punkte 634

OnSaveInstance wird aufgerufen, wenn ein Benutzer den Bildschirm dreht, damit die mit der neuen Ausrichtung verbundenen Ressourcen geladen werden können.

Es ist möglich, dass dieser Benutzer den Bildschirm gedreht und anschließend die Zurück-Taste gedrückt hat (denn es ist auch möglich, dass dieser Benutzer bei der Verwendung Ihrer App an seinem Telefon herumgefummelt hat)

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