2011-08-22 17 views
6

मुझे अपने 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

जो आप 'लोडर प्रबंधक' कह रहे हैं वास्तव में LoaderManager.LoaderCallbacks<D> इंटरफ़ेस का कार्यान्वयन है। आप एक अलग नाम का उपयोग करना चाह सकते हैं, यह भ्रमित है। यह एक सिंगलटन क्यों है? यह आम तौर पर एक गतिविधि या टुकड़े से जुड़ा हुआ है, संभवतया इंटरफ़ेस को कार्यान्वित करने वाली गतिविधि/टुकड़ा। आप अपने लोडर (गतिविधि/टुकड़ा) कहां बना रहे हैं? यह भी सुनिश्चित करें कि LoaderManager.initLoader()onCreate()/onActivityCreated() से कॉल करें, अन्यथा लोडर ठीक से शुरू नहीं हो सकता है।

+0

1. हाँ मुझे पता है कि नाम स्पष्ट नहीं है, क्षमा करें। 2. यह अब एक सिंगलटन नहीं है - उस भाग पर काम कर रहा है 3. मेरी मुख्य समस्या यह है कि मैं एक ही लोडर के साथ एक ही कर्सर का उपयोग अलग-अलग गतिविधियों से बंधे विभिन्न टुकड़ों में कर सकता हूं – Pikaling

+0

क्यों क्या आप कर्सर साझा करना चाहते हैं? शायद यह एक अच्छा विचार नहीं है: लोडर गतिविधियों/टुकड़ों द्वारा प्रबंधित होते हैं, इसलिए जब कोई अन्य गतिविधि समाप्त होती है तो आपका लोडर बंद हो सकता है। आप एक ही लोडर _class_ का उपयोग कर सकते हैं और इसे विभिन्न गतिविधियों/टुकड़ों में तत्काल स्थापित कर सकते हैं। –

+0

आपकी मदद के लिए धन्यवाद। मैं अपने सभी कोड के माध्यम से चला गया और फिर से काम किया, सब अब काम कर रहे हैं। कभी-कभी मैं ओओपी से नफरत करता हूं ... – Pikaling

0

जब आप एक कर्सर बना सकते हैं और एक डेटाबेस में यह इंगित करते हैं, आप इसे सिर्फ शून्य पर सेट नहीं कर सकता है। आपको कर्सर को स्पष्ट रूप से बंद करना होगा, या यह डेटाबेस को लॉक होने तक लॉक कर देगा।

मैं इस फिक्स को लागू करने के लिए एंड्रॉइड लाइफसाइकिल और आपके मौजूदा कॉलबैक का लाभ लेने की सलाह देता हूं।

आशा है कि इससे मदद मिलती है!

+0

अच्छी पकड़ - इसे बदला जाना चाहिए कर्सर() स्वैप नहीं है कर्सर() - मैंने बदल दिया है कि अब – Pikaling

+0

क्या आपको अभी भी वही समस्याएं हैं? – Codeman

+0

नहीं, मैंने इसे ठीक करने की कोशिश की और इसे और भी खराब कर दिया! हमेशा रास्ता ... – Pikaling

संबंधित मुद्दे