2011-09-19 11 views
8

एक वेब सेवा से डेटा डाउनलोड करने के लिए कस्टम AsyncTaskLoader का उपयोग करते समय, यदि मैं लोडिंग प्रक्रिया के बीच में होम बटन दबाता हूं और फिर ऐप को फिर से दर्ज करता हूं, तो ऑनलोड लोड () विधि नहीं कहा जाता है। मेरा टुकड़ा setRetainInstance(true) को onActivityCreated() में कॉल कर रहा है और यह उसी विधि में getLoaderManager.initLoader(0, null, this) भी कॉल करता है (जैसा कि अनुशंसित है)।ऑनलोड लोड होम नाम से वापस आने के बाद बुलाया नहीं गया

परीक्षण करते समय, मुझे लगता है कि onActivityCreated() को वापस आने पर यह नहीं कहा जाता है, इसलिए onLoadFinished() नहीं कहा जाता है। लेकिन initLoader() विधि कहां रखना है? मैंने कई स्थानों पर पढ़ा है कि इसे onResume() में नहीं बुलाया जाना चाहिए।

तो, कोई विचार? मेरे ऐप में विभिन्न स्क्रीनों में मेरे पास बहुत सारे लोडर हैं और मुझे इस मुद्दे को एक सुरुचिपूर्ण तरीके से हल करने की आवश्यकता है।

+0

आप कहाँ पढ़ा था कि 'initloader' बुलाया नहीं किया जाना चाहिए 'ऑनर्यूम()' में 'क्योंकि फ्रेमवर्क बग को काम करने के लिए बिल्कुल वही है जो https://code.google.com/p/android/issues/detail?id=63179 – faizal

+0

@faizal मुझे वास्तव में याद नहीं है। मैं बहुत समय पहले लोडर का उपयोग करने से दूर चले गए हैं। बहुत से विशेषज्ञ देव नेटवर्क लोड करने के लिए लोडर्स का उपयोग करने के खिलाफ अनुभव से सलाह देते हैं। –

उत्तर

22

मुद्दा 14,944 (http://code.google.com/p/android/issues/detail?id=14944) को देखने के बाद, मैं अपने कस्टम AsyncTaskLoader में onStartLoading() अधिभावी और forceLoad() फोन से समस्या हल हो जाती।

इससे भी बेहतर समाधान एक कस्टम माता पिता AsyncTaskLoader कि इस तरह दिखता है (ऊपर के लिंक से alexvem द्वारा एक सुझाव से लिया गया) बनाने के लिए है:

public abstract class AsyncLoader<D> extends AsyncTaskLoader<D> { 

    private D data; 

    public AsyncLoader(Context context) { 
     super(context); 
    } 

    @Override 
    public void deliverResult(D data) { 
     if (isReset()) { 
      // An async query came in while the loader is stopped 
      return; 
     } 

     this.data = data; 

     super.deliverResult(data); 
    } 


    @Override 
    protected void onStartLoading() { 
     if (data != null) { 
      deliverResult(data); 
     } 

     if (takeContentChanged() || data == null) { 
      forceLoad(); 
     } 
    } 

    @Override 
    protected void onStopLoading() { 
     // Attempt to cancel the current load task if possible. 
     cancelLoad(); 
    } 

    @Override 
    protected void onReset() { 
     super.onReset(); 

     // Ensure the loader is stopped 
     onStopLoading(); 

     data = null; 
    } 
} 
+0

मुझ पर स्टार्टलोडिंग() पर ओवरराइडिंग और इसमें बल लोड() को हल करके हल किया गया। – sandy

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