16

अपने लोडर प्रबंधक में लोडर की पहचान करते समय, आप अद्वितीय आईडी का उपयोग करते हैं। मैं पूछ रहा हूं कि उन आईडी को कितना अनूठा होना है।लोडर प्रबंधक का दायरा क्या है?

क्या प्रत्येक गतिविधि और टुकड़े का अपना लोडर प्रबंधक है? क्या टुकड़े उस गतिविधि के लोडरमैनेजर का उपयोग करते हैं, जिनसे वे जुड़े हुए हैं? क्या केवल एक लोडर प्रबंधक है जिसका आवेदन है?

बोनस पॉइंट यदि आप मुझे बता सकते हैं कि लोडरमैनेजर का उपयोग करने के लिए आप कैसे संभव हो सकते हैं। अगर मैं अपनी गतिविधि में प्रत्येक खंड को उसी लोडर मैनेजर का उपयोग करने के लिए चाहता हूं (उनमें से कुछ एक ही डेटा खींच रहे हैं और लोडर साझा करना अच्छा होगा), क्या यह संभव है?

+3

[** लोडर प्रबंधक (भाग 2) को समझना ** ** (http://www.androiddesignpatterns.com/2012/05/why-you-should-use-loadermanager.html) –

उत्तर

8

मैं वर्तमान में एंड्रॉइड संगतता पैकेज (मुख्य रूप से कर्सर लोडर और टुकड़ों के लिए) में अपना आवेदन पोर्ट कर रहा हूं। मैं वर्तमान में अपने 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 से कॉल किया जाता है।

मुझे लगता है कि एक अंतर्निहित अनियंत्रित कॉल है तो कर्सर लोडर पर एक रजिस्टर कॉल है।

जारी रखने के लिए ...

+0

उत्तर के लिए धन्यवाद! मैं कुछ आईओएस सामान कर रहा हूं, लेकिन एक सप्ताह या उससे भी ज्यादा समय में इस प्रश्न का उत्तर देने के साथ समय के साथ खेलने के लिए समय होना चाहिए। वापस रिपोर्ट करेंगे! :) – num1

+0

मैं अगले दिन भी इस पर काम करूंगा क्योंकि मेरे कार्यकर्ता इंतजार कर रहे हैं। – Renaud

+0

मैं अंततः अपने ContentProvider को अनुकूलित कर दूंगा। बोनस प्वाइंट के लायक नहीं होने के लिए खेद है ...;) – Renaud

0

हां। यह मेरे लिए काम किया। मेरे पास एक नेविगेशन ड्रॉवर में 3 अलग-अलग टुकड़े हैं जहां एक ही डेटा अलग-अलग सूची दृश्यों में आबादी है। (सभी टुकड़े समान गतिविधि का हिस्सा हैं)।

मेरे AsyncTaskLoader:

public class MyTaskLoader extends AsyncTaskLoader<HashMap<String, Integer>> { 

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

@Override 
public HashMap<String, Integer> loadInBackground() { 
... 
return hashMap; 
} 

... 
} 

सभी टुकड़े में एक ही लोडर आईडी का प्रयोग करें।

Fragment1:

public class Fragment1 extends BaseFragment implements LoaderManager.LoaderCallbacks<HashMap<String, Integer>> { 
@Override 
public void onCreate(Bundle savedInstanceState) { 

//initialize adapter 

getActivity().getSupportLoaderManager().initLoader(0, null, this); 

} 

@Override 
public Loader<HashMap<String, Integer>> onCreateLoader(int arg0, Bundle arg1) { 
    // TODO Auto-generated method stub 

    return new MyTaskLoader(getActivity()); 
} 

@Override 
public void onLoadFinished(Loader<HashMap<String, Integer>> arg0, 
     HashMap<String, Integer> data) { 
    // TODO Auto-generated method stub 

    listAdapter.setData(data.keySet()); 

} 

@Override 
public void onLoaderReset(Loader<HashMap<String, Integer>> arg0) { 
    // TODO Auto-generated method stub 

    listAdapter.setData(null); 
} 
} 

Fragment2 के लिए एक ही आईडी का उपयोग करें:

public class Fragment2 extends BaseFragment implements LoaderManager.LoaderCallbacks<HashMap<String, Integer>> { 
@Override 
public void onCreate(Bundle savedInstanceState) { 

//initialize adapter 

getActivity().getSupportLoaderManager().initLoader(0, null, this); 

} 

@Override 
public Loader<HashMap<String, Integer>> onCreateLoader(int arg0, Bundle arg1) { 
    // TODO Auto-generated method stub 

    return new MyTaskLoader(getActivity()); 
} 

@Override 
public void onLoadFinished(Loader<HashMap<String, Integer>> arg0, 
     HashMap<String, Integer> data) { 
    // TODO Auto-generated method stub 

    listAdapter.setData(data.keySet()); 

} 

@Override 
public void onLoaderReset(Loader<HashMap<String, Integer>> arg0) { 
    // TODO Auto-generated method stub 

    listAdapter.setData(null); 
} 
} 

एडाप्टर लोडर आरंभ से पहले प्रारंभ किया जाना चाहिए। अब तक काम करता है। लेकिन, क्या यह सही तरीका है? क्या एकाधिक टुकड़ों के लिए एक सामान्य लोडर का उपयोग करने के लिए एक बेहतर तरीका है?

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