无法恢复活动错误

bri*_*ian 12 android cursor android-4.0-ice-cream-sandwich

我的活动包含此代码以获取SD卡上的所有图像:

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();
Run Code Online (Sandbox Code Playgroud)

活动恢复时发生的事件:

03-14 14:06:48.380:E/AndroidRuntime(20793):java.lang.RuntimeException:无法恢复活动{}:java.lang.RuntimeException:无法恢复活动{}:android.database.StaleDataException:Attempted to关闭后访问游标.

它只发生在Android 4.0上.如果在Android 2.x或3.x上,它可以正常工作.但是,如果我更改了在"开发者选项"中选择"不保留活动"选项的系统设置.错误未显示.

我想修改我的代码以避免此错误而不更改系统设置.我该怎么办?

Luk*_*rog 41

我认为这是因为managedQuery调用+关闭光标.从managedQuery()方法的文档:

警告:不要对使用此方法获得的游标调用close(),因为活动将在适当的时候为您执行此操作.但是,如果从托管查询的光标上调用stopManagingCursor(Cursor),系统将不会自动关闭光标,在这种情况下,您必须调用close().

将光标留给Android系统进行管理,不要调用cursor.close();.

Note:managedQuery方法已弃用,应该避免使用,CursorLoaders而是实现.有关更多信息,请CursorLoaders访问developer.android.com.