2012-03-14 12 views
12

mia attività contiene questo codice per ottenere tutte le immagini sulla scheda SD:in grado di riprendere l'errore di attività

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 verificato mentre l'attività stava riprendendo:

03-14 14:06: 48.380: E/AndroidRuntime (20793): java.lang.RuntimeException: impossibile riprendere l'attività {}: java.lang.RuntimeException: impossibile riprendere l'attività {}: android.database.StaleDataException: tentato di accedere a un cursore dopo che è stato chiuso.

Si verifica solo su Android 4.0. Se su Android 2.xo 3.x, funziona normalmente. Ma se cambio l'impostazione di sistema che seleziona l'opzione "non mantenere attività" in "Opzioni sviluppatore". L'errore non viene visualizzato.

Desidero modificare il mio codice per evitare questo errore senza modificare le impostazioni di sistema. Come dovrei farlo?

risposta

41

Penso che questo sia dovuto alla chiamata managedQuery + alla chiusura del cursore. Dalla documentazione del metodo managedQuery():

Attenzione: Non chiamare close() su un cursore ottenuti con questo metodo, perché l'attività lo farà per voi al momento opportuno. Tuttavia, se si chiama stopManagingCursor (cursore) su un cursore da una query gestita , il sistema non chiude automaticamente il cursore e, in tal caso, , è necessario chiamare close().

Lasciare il cursore per il sistema Android da gestire e non chiamare cursor.close();.

Note: Procedimento managedQuery è obsoleto e dovrebbe essere evitato, implementare CursorLoaders invece. Maggiori informazioni su CursorLoaders possono essere trovate a developer.android.com.

+0

La tua risposta è giusta. Ma un'altra mia attività ha lo stesso errore. Il codice come questo http://stackoverflow.com/questions/9426170/why-the-cusor-null. Se non si chiama cursor.close(), il cousor otterrà null mentre esegue più loop. Come evitarlo? – brian

+0

@brian Forse i problemi della tua altra domanda sono a causa delle dimensioni delle operazioni che fai. Fai una ricerca completa di MediaStore.Images.Media' per due colonne, e poi fai diverse centinaia (o anche più di 1000) 'managedQuery' per ottenere le anteprime (anche se vuoi la miniatura non devi interrogare il' MediaStore .Images.Thumbnails' contentprovider?). Inoltre dici che il cursore a volte è nullo, ma non chiamerei chiudi sul cursore per lanciare un 'NullPointerException'? – Luksprog

+0

Ad esempio, ho 2000 foto. Il ciclo for da 1 a 1000 funziona ma più di 1000 diventeranno nulli. Se si utilizza NullPointerException, alcune foto potrebbero non essere aperte. – brian

0

rimuovere cursor.close(); nel codice funziona bene sicuramente

1

funzione, managedQuery() è sconsigliata.

Utilizzare getContentResolver(). Query().

I parametri sono gli stessi.

Problemi correlati