Ho un cursore restituito su un callback onLoadFinished
(da LoaderManager.LoaderCallbacks
) e desidero eseguire qualche (eventualmente costoso) post-elaborazione su questo cursore. Quindi, sto sparando un AsyncTask
che usa questo cursore. Tuttavia, mi sto crash intermittenti con questa eccezione:Utilizzo di un cursore restituito da un LoaderManager in un AsyncTask
android.database.StaleDataException: Attempted to access a cursor after it has been closed.
Il mio sospetto è che questo sta accadendo perché il cursore (gestito dal programma di caricamento nel thread UI) viene chiuso prima che il thread in background è rifinito con esso, poiché questo è un cursore gestito. Ecco del codice Parafrasato:
private class LoaderListener implements LoaderManager.LoaderCallbacks<Cursor> {
@Override
public void onCreateLoader(int d, Bundle args) {
return new CursorLoader(context, uri, projection, selection, selectionArgs, sortOrder);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
processCursor(cursor)
}
}
private void processCursor(final Cursor cursor) {
new AsyncTask<Void, Void, Result> {
@Override
Result doInBackground(Void... params) {
while(cursor.isAfterLast() == false) {
// doing some costly things with cursor
}
}
}.execute();
}
È possibile sia,
segnalalo qualche modo il cursore per impedire che venga chiusa dal thread dell'interfaccia utente.
Notificare al gestore che il cursore è ancora in uso.
Clonare in modo che l'istanza clonata non venga chiusa dal gestore.
Un'altra soluzione, ancora migliore?
Avendo questo post-elaborazione fatta sul thread UI non è assolutamente un'opzione, tuttavia, come può essere molto costoso.
Si può sempre saltare il 'CursorLoader' e rendere la query iniziale + l'elaborazione costosa in' AsyncTask'. – Luksprog
stai usando questo cursore per qualcos'altro? – njzk2