मुझे अपने AsyncTaskLoader के साथ कुछ समस्याएं आ रही हैं, यह सुनिश्चित नहीं है कि वे लोडर को पुनरारंभ करने का प्रयास करते समय दोनों संबंधित हैं। मेरे आवेदन में मेरे पास एक कस्टम कर्सर एडाप्टर के 3 उदाहरण हैं, जो एक कस्टम AsyncTaskLoader के 3 उदाहरणों द्वारा समर्थित हैं जो सिंगलटन लोडर मैनेजर द्वारा प्रबंधित किया गया है। समस्याओं दो differenct एडाप्टर/लोडर जोड़े से संबंधित हैं, लेकिन इस्तेमाल किया कोड प्रत्येक मामले में एक ही है:कस्टम AsyncTaskLoader कॉलबैक के साथ समस्या
getLoaderManager().restartLoader(loaderId, bundle, loaderManager);
समस्या 1: मैं restartLoader (कहते हैं) और LoaderManager को onCreateLoader के लिए एक कॉल पंजीकृत करता है, लेकिन नहीं एक onLoaderReset()। लोडर को वितरित करने के लिए मिलता है Result(), लेकिन ऑनलोड लोड() को कभी नहीं कहा जाता है। लोडर में न तो 'रीसेट' या 'स्टार्ट' फ्लैग सेट है (नीचे कोड देखें)।
समस्या 2: मैं restartLoader() को कॉल करता हूं और लोडरमैनेजर ऑनलोडर रीसेट() पर कॉल करता है। लोडर ऑनसेट पर जाता है(), लेकिन आगे नहीं मिलता है। कर्सर शून्य पर सेट है, लेकिन कोई नया कर्सर लोड नहीं है।
कोई विचार क्या समस्या हो सकती है? यहाँ लोडर और लोडर प्रबंधक के लिए कोड के कुछ है:
CustomCursorLoader.java
@Override
protected void onStartLoading() {
Log.v(TAG, "Starting Loader");
if (lastCursor != null) {
deliverResult(lastCursor);
}
if (takeContentChanged() || lastCursor == null) {
forceLoad();
}
}
@Override
public void deliverResult(Cursor cursor) {
Log.v(TAG, "Delivering result");
if (isReset()) {
Log.v(TAG, "reset");
if (cursor != null) {
cursor.close();
}
return;
}
Cursor oldCursor = lastCursor;
lastCursor = cursor;
if (isStarted()) {
Log.v(TAG, "started");
super.deliverResult(cursor);
}
if (oldCursor != null && oldCursor != cursor && !oldCursor.isClosed()) {
oldCursor.close();
}
}
@Override
protected void onReset() {
Log.v(TAG, "Reset");
super.onReset();
onStopLoading();
if (lastCursor != null && !lastCursor.isClosed()) {
lastCursor.close();
}
lastCursor = null;
}
CustomCursorLoaderManager.java:
@Override
public Loader<Cursor> onCreateLoader(int loaderId, Bundle bundle) {
return new CustomCursorLoader();
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
cursorAdapter.changeCursor(cursor);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
cursorAdapter.changeCursor(null);
}
1. हाँ मुझे पता है कि नाम स्पष्ट नहीं है, क्षमा करें। 2. यह अब एक सिंगलटन नहीं है - उस भाग पर काम कर रहा है 3. मेरी मुख्य समस्या यह है कि मैं एक ही लोडर के साथ एक ही कर्सर का उपयोग अलग-अलग गतिविधियों से बंधे विभिन्न टुकड़ों में कर सकता हूं – Pikaling
क्यों क्या आप कर्सर साझा करना चाहते हैं? शायद यह एक अच्छा विचार नहीं है: लोडर गतिविधियों/टुकड़ों द्वारा प्रबंधित होते हैं, इसलिए जब कोई अन्य गतिविधि समाप्त होती है तो आपका लोडर बंद हो सकता है। आप एक ही लोडर _class_ का उपयोग कर सकते हैं और इसे विभिन्न गतिविधियों/टुकड़ों में तत्काल स्थापित कर सकते हैं। –
आपकी मदद के लिए धन्यवाद। मैं अपने सभी कोड के माध्यम से चला गया और फिर से काम किया, सब अब काम कर रहे हैं। कभी-कभी मैं ओओपी से नफरत करता हूं ... – Pikaling