में एक LoaderManager से लौटे मैं एक कर्सर (LoaderManager.LoaderCallbacks
से) एक onLoadFinished
कॉलबैक पर लौट आए है, और मैं इस कर्सर पर कुछ (संभवतः महंगा) पोस्ट-प्रोसेसिंग करना चाहते हैं। इसलिए, मैं AsyncTask
को फायर कर रहा हूं जो इस कर्सर का उपयोग करता है। हालांकि, मैं इस अपवाद के साथ रुक-रुक कर दुर्घटनाओं हो रही है:एक कर्सर का उपयोग एक AsyncTask
android.database.StaleDataException: Attempted to access a cursor after it has been closed.
मेरे संदेह है कि इस वजह से कर्सर (यूआई थ्रेड में लोडर द्वारा प्रबंधित किया जा) हो रहा है से पहले पृष्ठभूमि धागे से समाप्त हो गया है बंद कर दिया जा रहा है यह, क्योंकि यह एक प्रबंधित कर्सर है।
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();
}
यह या तो संभव है,
किसी तरह यह यूआई धागे से बंद किया जा रहा से रोकने के लिए कर्सर को चिह्नित करता: यहां कुछ भावानूदित कोड है।
प्रबंधक कि कर्सर भी उपयोग में है सूचित करें।
क्लोन यह इतना है कि क्लोन उदाहरण प्रबंधक द्वारा बंद कर दिया नहीं होती है।
एक और भी बेहतर, समाधान?
यूआई थ्रेड पर किया गया यह पोस्ट-प्रोसेसिंग पूरी तरह से एक विकल्प नहीं है, हालांकि, यह बहुत महंगा हो सकता है।
आप हमेशा 'कर्सर लोडर' को छोड़ सकते हैं और प्रारंभिक क्वेरी + 'AsyncTask' में महंगी प्रसंस्करण कर सकते हैं। – Luksprog
क्या आप इस कर्सर का उपयोग किसी और चीज़ के लिए कर रहे हैं? – njzk2