2012-06-10 38 views
7

Tôi nhận được ngoại lệ sau với ứng dụng của mình. Tôi tin rằng điều này xảy ra khi người dùng rời khỏi ứng dụng trong một thời gian dài rồi quay trở lại ứng dụng đó. Tôi không thể sao chép nó tuy nhiên nó được hiển thị trong các bản ghi sự cố của tôi rất nhiều. Tôi không biết tại sao điều này lại xảy ra nên mọi đề xuất đều được đánh giá cao.Ngoại lệ tiểu bang đã lưu

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp/com.myapp.MyActivity}: java.lang.ArrayIndexOutOfBoundsException: length=3; index=-1 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2202) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2237) 
at android.app.ActivityThread.access$600(ActivityThread.java:139) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:154) 
at android.app.ActivityThread.main(ActivityThread.java:4974) 
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:784) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.ArrayIndexOutOfBoundsException: length=3; index=-1 
at java.util.ArrayList.get(ArrayList.java:306) 
at android.support.v4.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1764) 
at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:198) 
at com.myapp.MyActivity.onCreate(MyActivity.java:235) 
at android.app.Activity.performCreate(Activity.java:4538) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2158) 
... 11 more 

dòng 235 như sau:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); // line 235 

onSaveInstanceState của tôi() là khá đơn giản:

@Override 
public void onSaveInstanceState(Bundle state) { 
    super.onSaveInstanceState(state); 

    state.putInt("id1", id1); 
    state.putInt("id2", id2); 
    state.putInt("id3", id3); 
    state.putInt("id4", id4); 

} 
+0

là nó bởi vì một trong id1, id2, id3, id4 tương đương với -1 khi bạn đang lưu nó? – Blundell

+0

Họ không bao giờ nên là -1, tuy nhiên, tôi không tin rằng giá trị của các vấn đề int. – Nick

+0

Bạn có chắc chắn dòng 235 là dòng đó không. Việc xây dựng bạn có Log từ là giống như bạn đang kiểm tra? – Blundell

Trả lời

4

Tôi chạy vào vấn đề này cùng, tôi tin rằng nó là một lỗi với android. Hãy xem chủ đề này cho một giải pháp khả thi http://code.google.com/p/android/issues/detail?id=22404

+0

Tôi không chắc chắn nếu điều này là chính xác cùng một lỗi. Các số dòng đang tắt. Tất nhiên đó chỉ có thể là một phiên bản khác của thư viện hỗ trợ với cùng một lỗi ... hoặc nó có thể là một lỗi khác. – P1r4nh4

2

Tôi có vấn đề chính xác cùng, tôi theo lời khuyên được đưa ra trong liên kết của Kenny:

tôi sử dụng như sau:

FragmentManager.enableDebugLogging(true); 

này sẽ hiển thị trong nhật ký tất cả các cuộc gọi trên FragmentManager (các đoạn được thêm, xóa, ẩn, v.v.).

Nó cho phép tôi xem những gì đã xảy ra trong trường hợp của tôi, một trong những đoạn trong ứng dụng của tôi đôi khi không được lưu đúng trong trường hợp và nội dung của nó là rỗng.

Sau đó, sự cố xảy ra với cùng nhật ký lỗi khi ứng dụng tìm cách khôi phục đoạn không rỗng này khỏi cá thể.

Trong trường hợp của tôi, đoạn này hơi đặc biệt và được tạo tự động. Để chắc chắn không nhận được lỗi một lần nữa, tôi đã xóa đoạn khỏi số FragmentManager trước khi thoát khỏi Activity.

+2

Upvote cho 'FragmentManager.enableDebugLogging (true)' – Robert

0

Tôi đã gặp sự cố tương tự, xảy ra với các thay đổi định hướng, nhưng nó chỉ xảy ra với các phiên bản Android cũ hơn (4.0.4), các phiên bản mới hơn như 4.4.2 là tốt. Tôi muốn chia sẻ với các bạn cách tôi sửa nó.

Như Kenny và Yoann đề nghị, tôi đã sử dụng

FragmentManager.enableDebugLogging(true); 

và phát hiện ra rằng quá nhiều loại bỏ đã được thực hiện. Tôi đã phải xóa ft.remove(df) khỏi mã của tôi và bây giờ nó tốt với cả hai phiên bản được đề cập ở trên. Đây là mã của tôi:

if (savedInstanceState != null) { 
    final FragmentTransaction ft = getFragmentManager().beginTransaction(); 
    final DialogFragment df = (DialogFragment) getFragmentManager().findFragmentByTag("tag"); 
    if (df != null) { 
     df.dismiss(); 
     // ft.remove(df); 
     frag = new MyDialogFragment(); 
     frag.show(getFragmentManager(), "tag"); 
    } 
    ft.addToBackStack(null); 
    ft.commit(); 
} 

Vì lợi ích của sự hoàn chỉnh, đây là những gì tôi đã làm trong onSaveInstanceState(final Bundle outstate):

if (frag != null) { 
    getFragmentManager().putFragment(outState, "tag", frag); 
} 
Các vấn đề liên quan