35

में लोडर मैं एंड्रॉइड 3.0 में Loaders का उपयोग करने का तरीका जानने का प्रयास कर रहा हूं लेकिन इसे काम पर नहीं लग रहा है। दस्तावेज़ केवल CursorLoader का उपयोग करने का वर्णन करते हैं लेकिन मैं AsyncTaskLoader का उपयोग कर रहा हूं।एंड्रॉइड हनीकॉम

दस्तावेज़ों से ऐसा लगता है कि आपको केवल AsyncTaskLoader.loadInBackground() को लागू करने की आवश्यकता है, लेकिन इसे getLoaderManager().initLoader() के बाद कभी भी कॉल नहीं किया जाता है और फिर कॉलबैक में लोडर बनाते हैं।

मैं Created new loader LoaderInfo{4040a828 #0 : ArticleDataLoader{4036b350}} कहकर डीबग संदेश देख सकता हूं, ऐसा लगता है कि यह सफलतापूर्वक बनाया गया है।

क्या यह संभव है कि लोडर वर्तमान में एसडीके में टूटे हों या क्या लोडर बनाने के बाद आपको कॉल करने की आवश्यकता है? (उन्होंने CursorLoader उदाहरण में ऐसा नहीं किया है)।

संपादित करें: लोडर initLoader() से लौटे पर forceLoad() बुला की तरह लगता है कम से कम लोड हो रहा है शुरू होता है, लेकिन यह आप रोटेशन सही ढंग से नहीं संभाल सकता है :(

+0

यदि आपको इसका उत्तर मिल गया तो कृपया मुझे भी बताएं। मैं कुछ भी नहीं ढूंढ पाया है। –

+2

http://code.google.com/p/android/issues/detail?id=14944 भी है जो 'संपादन' टिप्पणी के समान कार्यवाही का उल्लेख करता है। –

+0

हां, यह मेरी बग रिपोर्ट है :) – alexanderblom

उत्तर

13

डियान हैकबर्न ने बग ट्रैकर पर जवाब दिया और हमें स्थिर पुस्तकालय कार्यान्वयन के लिए संदर्भित किया। कर्सर लोडर बल लोड कर रहा है() यही कारण है कि यह काम कर रहा है।

एक वर्ग जो बग ट्रैकर पर सबसे सरल मामलों में आप के लिए यह संभालती के लिए मेरे संलग्न वर्ग देखें: http://code.google.com/p/android/issues/detail?id=14944

+4

उन्हें वास्तव में सीपीएल>< – schwiz

+1

दस्तावेज करने की आवश्यकता है जो वास्तव में बेकार है। तो यहां दिखाया गया उदाहरण: http://developer.android.com/reference/android/content/AsyncTaskLoader.html यदि आप समर्थन लाइब्रेरी का उपयोग नहीं करते हैं तब तक काम नहीं करेंगे जब तक कि आप 'ऑनस्टार्ट लोडिंग' – Blundell

+0

ओवरराइड नहीं करते हैं, तो अब मेरा अपना संदर्भ स्रोत है समर्थन लाइब्रेरी का उपयोग कर ASyncTaskLoader के लिए: http://blog.blundell-apps.com/tut-asynctask-loader-using-support-library/ – Blundell

0

एलेक्स का मतलब है, आप अगर onLoadInBackground मान्य करने के लिए प्रयास किया था() यहां तक ​​कि कहा जाता है?

ऑनलोड लोडबैकग्राउंड(): वास्तविक लोड करने के लिए एक कार्यकर्ता थ्रेड पर कॉल किया गया। कार्यान्वयन सीधे परिणाम प्रदान नहीं करना चाहिए, लेकिन उन्हें इस विधि से वापस कर देना चाहिए, जो आखिरकार कॉलिंग को समाप्त कर देगा Result (D) UI थ्रेड। यदि कार्यान्वयन को यूआई थ्रेड पर परिणामों को संसाधित करने की आवश्यकता है तो वे deliveryRes को ओवरराइड कर सकते हैं अल्ट (डी) और ऐसा करते हैं।

+1

नहीं, जब तक आप बल लोड नहीं करते हैं तब तक यह कॉल नहीं किया जाता है। – alexanderblom

1

आप onStartLoading() विधि ओवरराइड करने के लिए की जरूरत है। developer website पर उदाहरण देखें।

/** 
    * Handles a request to start the Loader. 
    */ 
    @Override protected void onStartLoading() { 
     if (mApps != null) { 
      // If we currently have a result available, deliver it 
      // immediately. 
      deliverResult(mApps); 
     } 

     // Start watching for changes in the app data. 
     if (mPackageObserver == null) { 
      mPackageObserver = new PackageIntentReceiver(this); 
     } 

     // Has something interesting in the configuration changed since we 
     // last built the app list? 
     boolean configChange = mLastConfig.applyNewConfig(getContext().getResources()); 

     if (takeContentChanged() || mApps == null || configChange) { 
      // If the data has changed since the last time it was loaded 
      // or is not currently available, start a load. 
      forceLoad(); 
     } 
    } 
संबंधित मुद्दे