我的活动包含此代码以获取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上,它可以正常工作。但是,如果我更改了在“开发者选项”中选择“不保留活动”选项的系统设置。 错误未显示。
我想修改我的代码以避免此错误而不更改系统设置。我该怎么办?
答案 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()。
参数相同。