2016-02-06 12 views
7

Tôi có một ứng dụng Android, nơi tôi có một hoạt động và một chồng các mảnh.NullPointerException liên quan đến FragmentManager.popBackStack. Làm thế nào để giải quyết?

Sử dụng Crashlytics, tôi đã nhận được một trường hợp duy nhất của Exception sau:

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) 

Các mã được sản xuất lỗi này là:

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

Dựa trên thử nghiệm tôi đã thực hiện với điều này ứng dụng, người dùng mà ngoại lệ này xảy ra và thực tế là chỉ xảy ra một lần, tôi nghĩ rằng điều này Exception xảy ra khi một số trường hợp hợp nhất kỳ lạ xảy ra. (Về cơ bản, tôi không thể sao chép số này Exception vào cuối của tôi.) Tôi giả định điều này phải làm với người dùng đang chạy ứng dụng của tôi và sau đó tiếp tục lại sau đó, và sau đó cuộc gọi getFragmentManager() trả lại null.

Vì vậy, tôi biết rằng tôi có thể "sửa chữa" này với các mã như sau (thấy điều này như là một sửa chữa áp dụng cho một kho GitHub):

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

Trong khi tôi nhận ra rằng các mã trên sẽ "sửa chữa "vấn đề ở chỗ nó sẽ tránh NPE, (do đó dừng ứng dụng khỏi bị rơi), nó không thực sự" khắc phục "sự cố bằng cách cho phép ứng dụng của tôi hoạt động như mong muốn. Các Fragment trong câu hỏi là # 3 trong một đống mảnh vỡ, như thế này:

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

các hành vi mong muốn cho ứng dụng này là để đáp ứng với nút bấm điều này bằng cách popping trở lại Fragment # 1 là nhìn thấy được. Chỉ cần thêm mã ở trên có vẻ như nó sẽ giữ cho ứng dụng không bị lỗi, nhưng không thay đổi giao diện người dùng của ứng dụng theo cách mong muốn.

Tôi đang làm gì sai khi ứng dụng của tôi tiếp tục, đó là "trạng thái phân đoạn" đã hết hiệu lực?

+1

Tôi có cùng một vấn đề chính xác, tôi gọi getFragmentManager(). PopBackStack() trên nút để đóng đoạn và quay lại phần trước. Tôi cũng không thể tái tạo nó nhưng lỗi thường xuyên đủ để trở thành một vấn đề thực sự. –

+0

Tôi đang gặp phải sự cố này ngay bây giờ bạn có tìm thấy giải pháp không ?? –

Trả lời

0

Tôi chưa bao giờ gặp vấn đề với getFragmentManager() là null vì vậy tôi giả sử nó là phần popBack của câu lệnh gây ra sự cố. Đây là một giải pháp có thể để ngăn chặn sự cố và xử lý các ngoại lệ. Nếu nó chỉ xảy ra một lần, nó có thể là một trường hợp hiếm hoi.

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); 
    } 
}); 
Các vấn đề liên quan