2012-08-10 50 views
17

Tôi có một vấn đề nghiêm trọng với App của tôi liên tục bị rơi trên một số thiết bị cho người dùng với các ngoại lệ sau đây trong một Hoạt động onStart phương pháp:IllegalStateException - Hỗ trợ Fragment thư viện

Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1299) 
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1310) 
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:541) 
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:525) 
at android.support.v4.app.DialogFragment.show(DialogFragment.java:123) 

tôi không thể tái tạo lỗi này tại địa phương trong giả lập của tôi. Tôi đã tìm thấy một số câu hỏi liên quan đến vấn đề này trên stackoverflow: herehere

Tôi đã thử các giải pháp đề nghị, ví dụ: không cho phép bó trống trong onSaveInstance không phải trong mảnh vỡ cũng không hoạt động.

Tuy nhiên, vấn đề vẫn còn. Đây là báo cáo Tai nạn duy nhất tôi từng nhận được và tôi liên tục nhận được.

Có ai có giải pháp làm việc không?

Trả lời

7

Tôi đã giải quyết vấn đề này bằng

  • nâng cấp lib hỗ trợ của tôi để sửa đổi 10
  • sử dụng workaround được đăng ở đây:. http://code.google.com/p/android/issues/detail?id=23096 tức Thêm một đoạn phi ui trong onResumeFragments và gọi giao dịch tiếp tục ở Listener Callback .

Kiểm tra câu trả lời của tôi ở đây cho mã: "Can not perform this action after onSaveInstanceState" - why am I getting this exception from my activity's onResume method?

Got không IllegalStateException cho đến nay.

4

tôi giải quyết này bằng this workaround, cụ thể là đưa mã vào một phương pháp onPostResume() chức năng trong Hoạt động

+0

Ứng dụng có hoạt động không? –

+0

xuống phiếu bầu: onPostResume không khả dụng cho android.support.v4.app.Fragment – Loda

+1

@Loda nó nằm trong android.support.v4.app.FragmentActivity, không phải là Fragment – CACuzcatlan

-1

Read This Article.

Và,

This one.

Khi vấn đề này được hiểu, đi trước và thay đổi mọi thứ một cách chính xác:

Fig tìm hiểu lý do tại sao các giao dịch của bạn đang diễn ra bên ngoài trạng thái onResume của bạn. Tại sao những điều này xảy ra khi họ không nên. Tại sao bạn lại thêm và xóa các phân đoạn theo cách thủ công liên quan đến vòng đời của ứng dụng thay vì khi người dùng yêu cầu. Bạn có thể cần một thời gian trong onCreate() hoặc khi người dùng gọi một cái gì đó. Nhưng tại sao bạn lại rối tung với họ trong onResume() ngay từ đầu? Đừng làm thế.

Nếu bạn thay đổi tất cả .commit() thành .commitAllowStateLoss() thì sự cố sẽ biến mất. Nhưng, bạn nên làm điều đó. Bạn nên tắt đảm bảo rằng bạn không bao giờ thay đổi các đoạn của mình trừ khi ứng dụng hoàn toàn hoạt động. Đôi khi điều đó có nghĩa là không bao giờ tải một mảnh từ OnActivityResult() mà là gắn cờ để chạy trong onPostResume() của bạn, và tránh thực hiện thay đổi giao diện người dùng trong các chủ đề không đồng bộ giả định rằng bạn không thể giết hoạt động trong thời gian chờ đợi.

Nếu bạn chỉ muốn giải quyết mọi thứ, .commitAllowStateLoss() sẽ làm điều đó. Nếu bạn muốn làm điều đó đúng, hãy chắc chắn rằng bạn không fiddle với mảnh vỡ của bạn sau khi mọi thứ chết.

Một trong những hình thức mới hơn của Android circa Oreo tôi nghĩ, đã thay đổi điều này để tránh lỗi gây phiền nhiễu này.Câu trả lời của tôi có vẻ hơi mơ hồ nhưng đó là vì lỗi trong mô hình. Bạn hoàn toàn có thể nhấn điều đó với các yếu tố mã khác nhau và khá thường xuyên.

Các vấn đề liên quan