【问题标题】:Unable to resume Activity when retrieving images from SD card从 SD 卡中检索图像时无法恢复活动
【发布时间】:2012-03-14 06:16:58
【问题描述】:

我的活动包含此代码以获取 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();

Activity 恢复时发生的:

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 上,它可以正常工作。但是,如果我更改在“开发人员选项”中选择“不保留活动”选项的系统设置。 错误未显示。

我想在不更改系统设置的情况下修改我的代码以避免此错误。我该怎么做?

【问题讨论】:

    标签: android android-4.0-ice-cream-sandwich android-cursor


    【解决方案1】:

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

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

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

    Note: managedQuery 方法已被弃用,应该避免,改为实现 CursorLoaders。有关CursorLoaders 的更多信息,请访问developer.android.com

    【讨论】:

    • 你的回答是对的。但我的另一个活动有同样的错误。像这样的代码 stackoverflow.com/questions/9426170/why-the-cusor-null 。如果没有调用 cursor.close(),则在运行几个循环时,cousor 将变为 null。如何避免?
    • @brian 也许你其他问题的问题是因为你所做的操作的规模。您对两列的 MediaStore.Images.Media` 进行完整查询,然后制作数百个(甚至超过 1000 个)managedQuery 以获取缩略图(如果您想要缩略图也不应该查询 @987654334 @ 内容提供商?)。您还说光标有时为空,但不会在光标上调用 close 抛出 NullPointerException
    • 例如,我有 2000 张照片。从 1 到 1000 的 for 循环有效,但超过 1000 将变为空。如果使用 NullPointerException 可能会导致多张照片没有打开。
    • @brian 我不知道为什么会这样。也许您可以尝试一种新方法并避免该问题。
    • OK,减少光标调用似乎是唯一的方法。还是谢谢。
    【解决方案2】:

    删除代码中的cursor.close(); 它绝对可以正常工作

    【讨论】:

      【解决方案3】:

      函数,managedQuery() 已弃用。

      请使用 getContentResolver().query()。

      参数相同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-17
        • 1970-01-01
        • 2013-12-17
        相关资源
        最近更新 更多