2016-02-06 21 views
7

Ich habe eine Android-App, wo ich eine Aktivität und einen Stapel von Fragmenten habe. NullPointerException bezogen auf FragmentManager.popBackStack. Wie löst man?

Crashlytics Verwendung, habe ich eine einzelne Instanz der folgenden Exception erhalten:

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.FragmentManager.popBackStack(java.lang.String, int)' on a null object reference 
     at com.company.app.Fragment$7$2.onClick(Fragment.java:397) 
     at android.view.View.performClick(View.java:5197) 
     at android.view.View$PerformClick.run(View.java:20926) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:145) 
     at android.app.ActivityThread.main(ActivityThread.java:5942) 
     at java.lang.reflect.Method.invoke(Method.java) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194) 

Der Code, der diesen Fehler erzeugt ist:

okButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     dialog.dismiss(); 
     // The next line produces the Exception 
     getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
     new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       // Other code... 
     }, 250); 
    } 
}); 

Auf der Grundlage der Tests I mit dies getan haben App, der Benutzer, für den diese Ausnahme aufgetreten ist, und die Tatsache, dass es nur einmal aufgetreten ist, denke ich, dass diese Exception auftritt, wenn einige seltsame Konsolidierung von Umständen auftritt. (Grundsätzlich kann ich das Exception an meinem Ende nicht reproduzieren.) Ich gehe davon aus, dass dies mit dem Benutzer zu tun hat Hintergrund meiner App und dann zu einem späteren Zeitpunkt wieder aufnehmen, und dann der getFragmentManager() Aufruf eine null zurückgibt.

Also, ich weiß, dass ich dies mit Code wie folgt aus (fanden diese als angewandte Korrektur auf ein GitHub-Repository) „reparieren“ kann:

FragmentManager fm = getFragmentManager(); 
if (fm != null) fm.popBackStack(); 

Während ich erkennen, dass der obige Code „reparieren "Das Problem, dass es die NPE vermeiden wird (damit die App nicht abstürzt)," repariert "es das Problem nicht wirklich, indem es meiner App erlaubt, wie gewünscht zu funktionieren. Die Fragment in Frage # 3 in einem Stapel von Fragmenten, wie folgt aus:

#1 --> #2 --> #3 

Das gewünschte Verhalten für die App ist durch knallen zurück zu Fragment # 1 sichtbar auf diese Schaltfläche, um zu reagieren. Lediglich das Hinzufügen des obigen Codes scheint zu verhindern, dass die App abstürzt, ändert aber nicht die Benutzeroberfläche der App in der gewünschten Weise.

Was mache ich falsch, so dass, wenn meine App fortfährt, es "Fragment-Status" ist aus dem Gleichgewicht geraten?

+1

Ich habe genau das gleiche Problem, ich rufe getFragmentManager(). PopBackStack() auf eine Schaltfläche, um das Fragment zu schließen und zum vorherigen zurückzukehren. Ich kann es auch nicht reproduzieren, aber der Bug ist häufig genug, um ein echtes Problem zu sein. –

+0

ich stehe jetzt vor diesem problem hast du eine lösung ?? –

Antwort

0

Ich habe noch nie ein Problem mit der GetFragmentManager() als NULL konfrontiert, so nehme ich an, es ist der PopBack Teil der Anweisung, die das Problem verursacht. Hier ist eine mögliche Lösung, um einen Absturz zu verhindern und die Ausnahmen zu behandeln. Wenn es nur einmal passiert ist, mag es ein seltener Fall gewesen sein.

okButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     if (getSupportFragmentManager() != null) { 
      // Assuming the getFragmentManager() is not the Issue, rather the popBackStack is the issue 
      try { 
       getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
      } catch (Exception e) { 
       // Recreate a new instance of your first fragment here. 
      } 
     } else { 
      /* 
      getFragmentManager() == null 
      I have never faced an issue when getFragmentManager() == null, but I would restart the activity if that is the case 
      */ 

     } 
     new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 

      } 
     }, 250); 
    } 
}); 
Verwandte Themen