Question Impossible de reprendre une erreur d'activité


Mon activité contient ce code pour obtenir toutes les images sur la carte 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();

La survenue pendant la reprise de l'activité:

03-14 14: 06: 48.380: E / AndroidRuntime (20793): java.lang.RuntimeException: impossible de reprendre l'activité {}: java.lang.RuntimeException: impossible de reprendre l'activité {}: android.database.StaleDataException: tentative de accéder à un curseur après sa fermeture.

Il ne se produit que sur Android 4.0. Si vous utilisez Android 2.x ou 3.x, cela fonctionne normalement. Mais si je modifie le paramètre du système qui sélectionne l'option "Ne pas conserver les activités" dans "Options du développeur". L'erreur ne s'affiche pas.

Je souhaite modifier mon code pour éviter cette erreur sans modifier les paramètres du système. Comment devrais-je le faire?


12
2018-03-14 06:16


origine


Réponses:


Je pense que c'est à cause de la managedQuery Appelez + vous fermez le curseur. Des documents de la managedQuery() méthode:

Attention: N'appelez pas close () sur un curseur obtenu avec cette méthode,   parce que l'activité le fera pour vous au moment opportun.   Toutefois, si vous appelez stopManagingCursor (Cursor) sur un curseur à partir d'un   requête gérée, le système ne ferme pas automatiquement le curseur et,   dans ce cas, vous devez appeler close ().

Laissez le curseur sur le système Android pour gérer et ne pas appeler cursor.close();.

Note: le managedQuery la méthode est obsolète et il faut l'éviter, mettre en place CursorLoaders au lieu. Plus d'infos sur CursorLoaders peut être trouvé à developer.android.com.


41
2018-03-14 06:46



retirer cursor.close();  dans votre code ça marche bien définitivement


1
2018-02-09 11:20



Fonction, managedQuery () est obsolète.

Veuillez utiliser getContentResolver (). Query ().

Les paramètres sont les mêmes.


1
2018-03-31 06:49