Sto cercando di rendere la rotazione delle mie app amichevole, ma ho qualche problema a salvare il cursore.Come posso far sopravvivere un Cursore a un cambio di orientamento?
Il cursore contiene circa 13k + righe di dati visualizzati in un ListView
, e quindi richiederebbe un po 'di tempo se eseguissi una richiesta ogni volta che la configurazione cambia. Nel mio onRetainNonConfigurationInstance()
, restituisco il Cursore e quindi lo recupero tramite getLastNonConfigurationInstance()
.
Tuttavia, il mio cursore recuperato sembra essere già chiuso e quindi il mio adattatore non può più rendere l'elenco. Da quello che ho capito, il cursore è stato chiuso poiché onDestroy()
chiude automaticamente tutti i cursori.
risparmio il cursore in questo modo:
@Override
public Object onRetainNonConfigurationInstance() {
return myCursor;
}
e recuperare in questo modo:
myCursor = (Cursor)getLastNonConfigurationInstance();
if (myCursor == null) {
// Do some stuff here (access DB, etc)
} else { // we are returning from configuration change
// Feed the cursor to the adapter
}
sto incollando l'analisi dello stack se qualcuno vuole vedere le cose:
01-25 16:57:45.637: ERROR/AndroidRuntime(12976): android.database.StaleDataException: Access closed cursor
01-25 16:57:45.637: ERROR/AndroidRuntime(12976): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:217)
01-25 16:57:45.637: ERROR/AndroidRuntime(12976): at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
01-25 16:57:45.637: ERROR/AndroidRuntime(12976): at com.test.sample.helper.DictionaryAdapter.bindView(DictionaryAdapter.java:35)
[........More ListView-related errors here..........]
Ho passato il codice e ho scoperto che fino al onRetainNonConfigurationInstance()
, il cursore è ancora aperto, ma un Dopo averlo ottenuto attraverso getLastNonConfigurationInstance()
è già chiuso.
Come posso far sopravvivere il Cursore al cambio di orientamento? Grazie per l'aiuto!
EDIT: Sulla base di risposta di Romain, ho commentato tutti i miei startManagingCursor()
s. Avrei dovuto collegare i punti e pensarci! Ad ogni modo, la mia app ora sopravvive a una rotazione, ma riportandola all'orientamento originale continua a bloccarla. Continuo il mio debugging e ti farò sapere cosa scopro.
EDIT2: Penso di aver trovato che cosa sta causando i nuovi errori. Ho implementato uno FilterQueryProvider
che restituisce un nuovo cursore. Quello che ho fatto è stato assegnare i risultati di quel filtro al mio Cursore originale. Sembra funzionare finora.
Sì! Sto usando un cursore gestito. Ho provato a commentare tutto il mio 'startManagingCursor()', e finora l'app è sopravvissuta passando da verticale a orizzontale. Ma cambiandolo di nuovo in verticale si blocca l'applicazione (Causato da: java.lang.IllegalStateException: tentativo di acquisire un riferimento su un chiudi SQLiteClosable). Cercherò di eseguire il debug di più, ma questa risposta sicuramente ha aiutato! Grazie Romain! Riferirò su qualunque cosa accada ai miei test. – Zarah