2011-01-25 10 views
8

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.

risposta

4

Probabilmente stai usando un cursore gestito. I cursori gestiti vengono automaticamente chiusi quando l'attività viene distrutta. Dovresti passare a un cursore non gestito.

+0

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

0

Basta aggiungere questo attributo nel tag di attività nel file menifest

android: configChanges = "orientamento | keyboardHidden"

che verrà risolvere questo

senza necessità di implementare qualsiasi altra cosa

:) Mi ha aiutato anche se

+0

Ciao Javanator!Per quanto possibile mi piacerebbe avere il modo "corretto" di gestire il cambiamento. Secondo la documentazione, dovrebbe essere l'ultima risorsa. ;) Quindi speriamo di poter risolvere il problema. : D – Zarah

+0

Sto aspettando il tuo risultato. questa semplice soluzione una volta risolto un mio problema complesso. Anche questo non è una scorciatoia per nulla. basta dire al gestore delle attività di non chiamare nuovamente onCreate. Per quanto ne so. :) – Javanator

+0

Questo, secondo la [documentazione] [1]: 'Nota: la gestione della modifica della configurazione può rendere molto più difficile l'utilizzo di risorse alternative, poiché il sistema non le applica automaticamente. Questa tecnica dovrebbe essere considerata l'ultima risorsa e non è raccomandata per la maggior parte delle applicazioni. Vi farò sapere come risolvo questo problema. :) [1] http://developer.android.com/guide/topics/resources/runtime-changes.html#RetainingAnObject – Zarah

Problemi correlati