Android FragmentManager BackStackRecord.run wirft NullPointerException

Lesezeit: 3 Minuten

Android FragmentManager BackStackRecordrun wirft
NickL

Beim Arbeiten mit Fragmenten erhalte ich manchmal die folgende Ausnahme:

FATAL EXCEPTION: main
java.lang.NullPointerException
    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:591)
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416)
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:420)
    at android.os.Handler.handleCallback(Handler.java:615)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4745)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    at dalvik.system.NativeStart.main(Native Method)

Die Ausnahme tritt auf, wenn run() von BackStackRecord heißt durch execPendingTransactions(), wenn versucht wird, ein Fragment aus dem Manager zu entfernen.

case OP_REMOVE: {
  Fragment f = op.fragment;
  f.mNextAnim = op.exitAnim; <----
  mManager.removeFragment(f, mTransition, mTransitionStyle);
}
break;

Ich kann nicht herausfinden, woran das genau liegt? Ich denke, es hat damit zu tun, dass der Backstack von Fragmenten beim Entfernen von Fragmenten nicht richtig aufgeräumt wird.

Android FragmentManager BackStackRecordrun wirft
NickL

Beantwortung meiner eigenen Frage:

Diese Ausnahme wird (eventuell) beim Aufrufen ausgelöst FragmentTransaction.remove(null); und FragmentTransaction.commit();

BEARBEITEN: Und auch, wie Twice Circled und ShinyuX im Kommentar darauf hinweisen; beim anrufen show(null) oder add(null), attach(null) und detach(null) Methoden und wahrscheinlich auch hide(null)

Nach dem Anruf commit(), wird die Transaktion im FragmentManager in die Warteschlange gestellt. Als Ergebnis, wenn die Operation verarbeitet wird, nachdem Sie explizit aufgerufen haben FragmentManager.executePendingTransactions(), oder wenn der FragmentManager-Warteschlangenthread ihn aufruft, wirft er a NullPointerException.

In meinem Fall habe ich Fragmentzustände in einem globalen Objekt verwaltet. Dort habe ich überprüft, ob das Fragment angezeigt wird oder nicht, und dann sichtbare Fragmente entfernt. Aber da ich eine neue FragmentActivity gestartet habe, waren diese Zustände immer noch auf true gesetzt, während sie nicht sichtbar waren. Das ist also ein Konstruktionsfehler.

Abgesehen von der Behebung des Konstruktionsfehlers war die Lösung einfach: Überprüfen Sie, ob FragmentManager.findFragmentByTag() ist zurückgekommen null bevor Sie das Fragment entfernen.

  • Gute Antwort – Dies hat mir geholfen, mein eigenes Problem zu lösen. Beachten Sie, dass Sie denselben Fehler erhalten, wenn Sie FragmentTransaction.show(null), .hide(null) usw. aufrufen, nicht nur .remove(null). Hoffentlich hilft dies anderen, ihr Problem aufzuspüren.

    – Zweimal eingekreist

    5. Februar ’13 um 11:20


  • Hat mir viel geholfen ! Beachten Sie, dass es bei jeder Aktion fehlschlägt, die mit einem Null-Fragment gesendet wird (in meinem Fall attach detach

    – ShinyuX

    6. März ’14 um 14:17

  • Danke dafür, hat auf jeden Fall geholfen. In meinem Fall navigierte ich zurück zu einer zerstörten FragmentActivity, in der ich Verweise auf Fragmente in Feldern aufbewahrte. Die Lösung war zu verwenden findFragmentByTag und weisen Sie diese Felder der onCreate-Methode der Aktivität neu zu – wenn savedInstanceState != null (in diesem Fall wären die Fragmente nicht neu erstellt worden – siehe Muster Hier).

    – kassim

    16. Juni ’14 um 15:13

  • das sollte beim eigentlichen total abstürzen hide,show… aufrufen, damit der Stacktrace auch tatsächlich verwendbar ist …

    – njzk2

    20. August ’14 um 19:57

  • Konnte nicht mehr zustimmen @njzk2

    – NickL

    6. Januar ’15 um 12:26

Der einzige Grund, warum es passiert, ist das Aufrufen

getSupportFragmentManager().beginTransaction().remove(fragment)

während fragment ist Null

Android FragmentManager BackStackRecordrun wirft
seufagner

Ich verwende kein Tag, um die Fragmente zu erstellen (sie funktionieren wie TabBar-Container).

Es funktioniert also beim Wechseln der Tabulatortaste, aber wenn ich die Zurück-Taste drücke, erhalte ich den gleichen Fehler.

Bei der onDestroyView-Methode habe ich eine Fragmentinstanz mit FragmentManager#findFragmentById gefunden, FragmentManager#findFragmentByTag gibt jedoch null zurück.

class MyFragment extends ListFragment {

@Override
public void onDestroyView() {
    super.onDestroyView();

    if (this.mapFragment != null
            && getFragmentManager().findFragmentById(
                    this.mapFragment.getId()) != null) {

        getFragmentManager().beginTransaction().remove(this.mapFragment)
                .commit();
        this.mapFragment = null;
    }

}
}

  • Warum ist es notwendig, mapFragment auf null zu setzen?

    – Igor Ganapolsky

    27. Okt ’13 um 10:07

  • Eine Frage, die es wert ist beantwortet zu werden :- Why is it necessary to set mapFragment to null?

    – nmxprime

    17. Dez. ’14 um 15:12

.

299860cookie-checkAndroid FragmentManager BackStackRecord.run wirft NullPointerException

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy