Android FragmentManager BackStackRecord.run wirft NullPointerException

Ich bekomme manchmal die folgende Ausnahme, wenn ich mit Fragmenten arbeite:

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 über execPendingTransactions() BackStackRecord wird, 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, was genau das verursacht? Ich denke, es hat mit dem Stapel von Fragmenten zu tun, die nicht direkt beim Entfernen von Fragmenten aufgeräumt werden.

   

Beantworte meine eigene Frage:

Diese Ausnahme wird (möglicherweise) ausgetriggers, wenn Sie FragmentTransaction.remove(null); aufrufen FragmentTransaction.remove(null); und FragmentTransaction.commit();

EDIT: Und auch, wie Twice Circled und shinyuX im Kommentar darauf hinweisen; Wenn Sie show(null) oder add(null) aufrufen, attach(null) Methoden attach(null) und detach(null) an und hide(null) wahrscheinlich auch hide(null)

Nach dem Aufruf von commit() wird die Transaktion in den FragmentManager eingereiht. Wenn die Operation verarbeitet wird, nachdem Sie FragmentManager.executePendingTransactions() explizit aufgerufen haben oder wenn der FragmentManager-Warteschlangen-Thread sie aufruft, wird als NullPointerException eine NullPointerException .

In meinem Fall habe ich Fragmentzustände in einem globalen Objekt beibehalten. Dort habe ich überprüft, ob das Fragment sichtbar ist oder nicht, und dann sichtbare Fragmente entfernt. Aber weil ich eine neue FragmentActivity gestartet habe, wurden diese Zustände immer noch auf “True” gesetzt, während sie nicht sichtbar waren. Das ist also ein Konstruktionserrors.

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

Der einzige Grund, warum es passiert, ist es aufzurufen

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

während das fragment null ist

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

Also, es funktioniert, wenn Tab wechseln, aber wenn ich Zurück-Taste drücke, bekomme ich den gleichen Fehler.

Bei der onDestroyView-Methode habe ich eine Fragment-Instanz mit FragmentManager # findFragmentById gefunden, jedoch liefert FragmentManager # findFragmentByTag null, sure.

 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; } } }