2012-07-01 22 views
7

ClassCastException xảy ra ngẫu nhiên để khôi phục Vector trong onRestoreInstanceState(). Nói chung khôi phục vectơ đã hoàn thành tốt, nhưng đôi khi ngoại lệ xảy ra.ClassCastException xảy ra trong onRestoreInstanceState

Tôi nghĩ điều đó xảy ra khi hoạt động được chuyển sang nền và bị phá hủy nhưng tôi không chắc chắn.

Bất kỳ ý tưởng nào? Cảm ơn bạn.

Stack<LocationInfo> mLocationInfoVector; 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    outState.putSerializable("locationInfos", mLocationInfoVector); 

    super.onSaveInstanceState(outState); 
} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    if (savedInstanceState.getSerializable("locationInfos") != null) { 
     @SuppressWarnings("unchecked") 
     mLocationInfoVector= (Stack<LocationInfo>) savedInstanceState.getSerializable("locationInfos"); 
    } 

    super.onRestoreInstanceState(savedInstanceState); 
} 

thêm:

tôi quên đính kèm bản ghi ngoại lệ. Đó là

java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Stack 
+1

Tôi đề nghị bạn viết lại phương thức 'onRestoreInstanceState' như sau:' Object saved = savedInstanceState.getSerializable ("locationInfos"); if (lưu instanceof Stack) {mLocationInfoVector = (Stack ) được lưu; } else if (lưu! = null) {Log.e ("RestoreBug", "Lớp đối tượng được khôi phục:" + saved.getClass(). getName()); } 'Sau đó, bạn ít nhất có thể thấy những gì bạn đang nhận được trở lại. (Xin lỗi vì đã đăng bài trong một bình luận; Tôi không muốn đăng bài này như là một câu trả lời). –

+0

Tôi nghĩ theo cách đó, nhưng tôi thực sự muốn biết cơ chế nào tạo ra trường hợp này. Tôi đã thêm nhật ký ngoại lệ và tôi không biết tại sao loại đối tượng được thay đổi thành ArrayList. – chris

+0

Có khả năng siêu lớp hoạt động của bạn ghi đè lên 'onSaveInstanceState' không? Tôi đang tự hỏi nếu bạn đang sử dụng '" locationInfos "' chìa khóa bất cứ nơi nào khác trong mã của bạn. (P.S. trong mọi trường hợp, bạn nên tổ chức lại mã 'onRestoreInstanceState' để nó chỉ gọi' getSerializable() 'một lần.) –

Trả lời

5

tôi sử dụng mã bên cạnh khôi phục Vector:

objects = new Vector<Object>((Collection<Object>) state.getSerializable(EXTRA_OBJECTS)); 

Nó ngăn chặn java.lang.ClassCastException và tiết kiệm các yếu tố theo thứ tự.

Để khôi phục Stack, bạn có thể sử dụng mã tiếp theo:

stack = new Stack<Object>(); 
stack.addAll((Collection<Object>) state.getSerializable(EXTRA_STACK)); 

Nó hoạt động do Vector, Stack, ArrayList được mở rộng Bộ sưu tập, và bạn có thể cast đối tượng serialized của bạn vào bộ sưu tập và vượt qua để Stack hoặc Vector addAll() phương pháp.

+0

cậu bé, đó là điều sai lầm. cảm ơn. –

4

Điều này thường xảy ra khi hoạt động đã bị hủy do áp lực bộ nhớ. Gói được chuyển tới onRestoreInstanceState dường như giữ lại một cá thể của lớp cơ sở (ArrayList trong trường hợp này).

Bạn có thể mô phỏng sự cố bằng cách tinh chỉnh các tùy chọn nhà phát triển:

  1. Đến Cài đặt | Tùy chọn nhà phát triển
  2. Kiểm tra hộp "Đừng giữ các hoạt động"

Bây giờ hoạt động của bạn sẽ bị phá hủy ngay lập tức sau khi bạn rời khỏi nó. Khởi chạy hoạt động được đề cập, nhấn nút Trang chủ và sau đó chuyển về ứng dụng của bạn, hãy kích hoạt ClassCastException.

Trong khi đó, đề nghị Ted Hopp để sử dụng

if (saved instanceof Stack) { 
    .... 
} 

nên tránh đâm ứng dụng.

+0

Tôi vẫn không biết cơ chế lưu giá trị tồn tại trong nhóm, nhưng loại được thay đổi. – chris

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