2012-03-14 41 views
12

Hoạt động của tôi chứa mã này để có được tất cả hình ảnh trên thẻ SD:Không thể tiếp tục Hoạt động lỗi

String[] projection = {MediaStore.Images.Media._ID, 
         MediaStore.Images.Media.DATA, 
         MediaStore.Images.ImageColumns.DATA}; 
Cursor cursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
          projection, null, null, 
          MediaStore.Images.Media._ID); 
int count = cursor.getCount(); 
int image_path_index = cursor.getColumnIndex(MediaStore.Images.Media.DATA); 
int i; 
for(i = 0; i < count; i++) { 
    cursor.moveToPosition(i); 
    String p = cursor.getString(image_path_index); 
    fd.addToPhonePhoto(p); 
} 
cursor.close(); 

việc xảy ra trong khi Hoạt động được khôi phục:

03-14 14:06: 48.380: E/AndroidRuntime (20793): java.lang.RuntimeException: Không thể tiếp tục hoạt động {}: java.lang.RuntimeException: Không thể tiếp tục hoạt động {}: android.database.StaleDataException: Đã cố gắng truy cập con trỏ sau khi nó đã được đã đóng cửa.

Nó chỉ xảy ra trên Android 4.0. Nếu trên Android 2.x hoặc 3.x, nó hoạt động bình thường. Nhưng nếu tôi thay đổi cài đặt hệ thống, chọn tùy chọn "không giữ hoạt động" trong "Tùy chọn nhà phát triển". Lỗi không hiển thị.

Tôi muốn sửa đổi mã của mình để tránh lỗi này mà không thay đổi cài đặt hệ thống. Tôi nên làm như thế nào?

Trả lời

41

Tôi nghĩ điều này là do cuộc gọi managedQuery + bạn đóng con trỏ. Từ các tài liệu của phương pháp managedQuery():

Cảnh báo: Đừng gọi close() trên một con trỏ được sử dụng phương pháp này, vì hoạt động này sẽ làm điều đó cho bạn tại thời điểm thích hợp. Tuy nhiên, nếu bạn gọi stopManagingCursor (Con trỏ) trên con trỏ từ một truy vấn được quản lý , hệ thống sẽ không tự động đóng con trỏ và, trong trường hợp đó, bạn phải gọi close().

Để con trỏ cho hệ thống Android quản lý và không gọi cursor.close();.

Note: Phương pháp managedQuery bị phản đối và nó nên tránh, thực hiện CursorLoaders để thay thế. Thông tin thêm về CursorLoaders có thể được tìm thấy tại developer.android.com.

+0

Câu trả lời của bạn là đúng. Nhưng một hoạt động khác của tôi có cùng lỗi. Mã như thế này http://stackoverflow.com/questions/9426170/why-the-cusor-null. Nếu không gọi cursor.close(), cousor sẽ nhận null trong khi chạy vài vòng lặp. Làm thế nào để tránh nó? – brian

+0

@brian Có lẽ vấn đề từ câu hỏi khác của bạn là do kích thước của các hoạt động bạn làm. Bạn thực hiện truy vấn đầy đủ của MediaStore.Images.Media' cho hai cột, và sau đó tạo vài trăm (hoặc thậm chí trên 1000) 'managedQuery' để có được hình thu nhỏ (cũng nếu bạn muốn hình thu nhỏ không nên bạn truy vấn' MediaStore .Images.Thumbnails' contentprovider?). Ngoài ra bạn nói rằng con trỏ đôi khi null, nhưng sẽ không gọi gần trên con trỏ ném một 'NullPointerException'? – Luksprog

+0

Ví dụ: tôi có 2000 ảnh. Vòng lặp for từ 1 đến 1000 hoạt động nhưng sau đó 1000 sẽ nhận được null. Nếu sử dụng NullPointerException có thể gây ra một số hình ảnh không được mở. – brian

0

remove cursor.close(); trong mã của bạn nó hoạt động tốt chắc chắn

1

Chức năng, managedQuery() bị phản đối.

Vui lòng sử dụng truy vấn getContentResolver().().

Các thông số giống nhau.

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