Не удалось возобновить ошибку активности - PullRequest
12 голосов
/ 14 марта 2012

Моя активность содержит этот код для получения всех изображений на 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 ]

41 голосов
/ 14 марта 2012

Я думаю, это из-за вызова managedQuery + закрытия курсора.Из документов метода managedQuery():

Предупреждение. Не вызывайте close () для курсора, полученного с помощью этого метода, потому что действие сделает это за вас вподходящее время.Однако если вы вызовите stopManagingCursor (Cursor) для курсора из управляемого запроса, система не закроет курсор автоматически, и в этом случае вы должны вызвать close ().

Оставить курсордля системы Android для управления и не вызывать cursor.close();.

Note: Метод managedQuery устарел и его следует избегать , реализоватьCursorLoaders вместо.Более подробную информацию о CursorLoaders можно найти на developer.android.com.

1 голос
/ 31 марта 2017

Функция managedQuery () устарела.

Пожалуйста, используйте getContentResolver (). Query ().

Параметры одинаковы.

1 голос
/ 09 февраля 2017

удалить cursor.close(); в вашем коде он работает определенно

...