无法恢复活动错误

时间:2012-03-14 06:16:59

标签: 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();

活动恢复时发生:

  

03-14 14:06:48.380:E / AndroidRuntime(20793):java.lang.RuntimeException:无法恢复活动{}:java.lang.RuntimeException:无法恢复活动{}:android.database.StaleDataException :在光标关闭后尝试访问它。

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

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

3 个答案:

答案 0 :(得分:41)

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

  

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

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

Note: {@ 1}}方法已弃用且应避免,请改为实施CursorLoaders。有关managedQuery的更多信息,请访问developer.android.com

答案 1 :(得分:1)

删除代码中的cursor.close(); 它确实很好用

答案 2 :(得分:1)

功能,不推荐使用managedQuery()。

请使用getContentResolver()。query()。

参数相同。