मैं वर्तमान में एंड्रॉइड संगतता पैकेज (मुख्य रूप से कर्सर लोडर और टुकड़ों के लिए) में अपना आवेदन पोर्ट कर रहा हूं। मैं वर्तमान में अपने ContentProvider को एक क्वेरी को छोड़ने के लिए दो खंडों के बीच एक कर्सर लोडर साझा करने का प्रयास कर रहा हूं। मेरी दुनिया में आपका स्वागत है! ;)
एक साधारण उपयोग के मामले:।
- DummyActivity फैली FragmentActivity/Log.d (Constants.LOGTAG, "DummyActivity.onCreate" + getSupportLoaderManager() toString());
- डेटाफ्रेगमेंट लोडर मैनेजर लोड करता है लोडर मैनेजर। लोडर कॉलबैक/लॉग डी (कॉन्स्टेंट्स.एलजीजीएजी, "डेटाफ्रैगमेंट.ऑनक्रेट" + getLoaderManager()। ToString());
- ReportFragment टुकड़ा लागू करता फैली LoaderManager.LoaderCallbacks/Log.d (Constants.LOGTAG, "ReportFragment.onCreate" + getLoaderManager() toString()।);
डमीएक्टिविटी डेटाफ्रैगमेंट को कम करता है और बाद में रिपोर्टफ्रैगमेंट को कम करता है। लॉगक आउटपुट प्रत्येक लोडर प्रबंधक के लिए differents पते दिखाता है। पहले निष्कर्ष के रूप में, प्रत्येक टुकड़े में उचित लोडर प्रबंधक होता है ...
यदि मैं आपके (हमारे;)) प्रश्न का उत्तर दे सकता हूं तो मैं जारी रखूंगा और अपडेट करूँगा। यदि आपने कोई प्रगति की है, तो कृपया अपना मूल्यवान ज्ञान साझा करें।
अद्यतन:
मेरे धारणा है कि लोडर आईडी केवल टुकड़ा के साथ जुड़े होने के लिए कई स्थानीय लोडर सक्षम करने के लिए एक विशिष्ट टुकड़ा के लिए एक LoaderManager की एक स्थानीय क्षेत्र के साथ जुड़े रहे हैं है (ताकि आप लौट सकते हैं एक id int arg और initLoader कॉल के आधार पर क्रिएटलोडर पर अलग लोडर)। - सबसे पहले, मैं DummyActivity onCreate
विधि में getSupportLoaderManager().enableDebugLogging(true);
साथ LoaderManager डिबगिंग सक्षम किया है
:
अब तक मैं एक लोडर (... या नहीं) "का पुन: उपयोग" में कामयाब रहे।
- फिर मैंने को onCreate
डेटाफ्रैगमेंट और रिपोर्टफ्रैगमेंट दोनों तरीकों से बुलाया है।
- डेटाफ्रैगमेंट onCreateLoader
विधि द्वारा बनाए गए कर्सर लोडर को mCursorLoader निजी सदस्य पर एक सेटटर के माध्यम से दिखाता है।
- रिपोर्टफ्रैगमेंट onCreateLoader
डाटाफ्रैगमेंट कर्सर लोडर (findFragmentByTag
के साथ फ्रैगमेंट पुनर्प्राप्त करने के बाद) देता है।
फ़िल्टर्ड (और थोड़ा अस्पष्ट) logcat उत्पादन:
DummyApp D DummyActivity.onCreate
DummyApp D DataFragment.newInstance
DummyApp D ReportFragment.newInstance
DummyApp D DataFragment.onCreate
LoaderManager V initLoader in LoaderManager{405a19d0 in SpecificAction{4059ee98}}: args=null
DummyApp D DataFragment.onCreateLoader
LoaderManager V Created new loader LoaderInfo{405a2298 #78 : CursorLoader{405a22e0}}
DummyApp D DataFragment.onCreate
DummyApp D DataFragment.onActivityCreated
DummyApp D ReportFragment.onCreate
LoaderManager V initLoader in LoaderManager{405a19d0 in DummyActivity{4059ee98}}: args=null
LoaderManager V Re-using existing loader LoaderInfo{405a2298 #78 : CursorLoader{405a22e0}}
DummyApp D SpecificActionReportFragment.onCreate
DummyApp D SpecificActionReportFragment.onActivityCreated
LoaderManager V Starting in LoaderManager{405a19d0 in DummyActivity{4059ee98}}
LoaderManager V Starting: LoaderInfo{405a2298 #78 : CursorLoader{405a22e0}}
DummyProvider D query called
DummyProvider D […]
DummyProvider D [end of query]
LoaderManager V onLoadComplete: LoaderInfo{405a2298 #78 : CursorLoader{405a22e0}}
LoaderManager V onLoadFinished in CursorLoader{405a22e0 id=78}: CursorWrapperInner{405afb20}
DummyApp D ReportFragment.onLoadFinished
DummyApp D ReportFragment.displayActionReport
DummyApp D DummyActivity.setReportViewsVisibility
DummyApp D ReportFragment.setSaveReportImageViewVisibility
दो टुकड़े DummyActivity onCreate
विधि (वर्णित उपयोग के मामले से अलग से जोड़ रहे हैं, लेकिन इस मुद्दे पर हम काम कर रहे हैं करने के लिए कुछ भी नहीं बदलता है)। दुर्भाग्यवश, लोडर को को नवीनतम खंड में कॉल करने के लिए पुन: असाइन किया गया है (यहां रिपोर्टफ्रैगमेंट) ... और DataFragment.onLoadFinished कभी नहीं कहा जाता है। नतीजतन, रिपोर्टफ्रैगमेंट अच्छा दिखता है लेकिन डेटाफ्रैगमेंट अद्यतित नहीं है क्योंकि अद्यतन को इस श्रेणी के onLoadFinished
से कॉल किया जाता है।
मुझे लगता है कि एक अंतर्निहित अनियंत्रित कॉल है तो कर्सर लोडर पर एक रजिस्टर कॉल है।
जारी रखने के लिए ...
[** लोडर प्रबंधक (भाग 2) को समझना ** ** (http://www.androiddesignpatterns.com/2012/05/why-you-should-use-loadermanager.html) –