2015-08-06 3 views
12

के साथ निर्भर क्वेरी लोड करने की पसंदीदा विधि Android में LoaderManager API के साथ निर्भर क्वेरी लोड करने की पसंदीदा विधि क्या है? अब सबसे अच्छा के रूप में मैं ऊपर आ सकता है की तर्ज पर कुछ है के साथ:लोडरमेनर

@Override 
public void onCreate(Bundle savedInstanceState) { 
    getLoaderManager().initLoader(FIRST, null, this); 
} 

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
    switch (loader.getId()) { 
    case FIRST: 
     Bundle args = new Bundle(); 
     args.putInt(ID, somethingFromData(data)); 
     getLoaderManager().restartLoader(SECOND, args, this); 
     break; 

    case SECOND: 
     somethingElseFromData(data); 
     break; 
    } 
} 

इस बार के ठीक सबसे काम करता है, लेकिन यह बुरी तरह के तहत एक विशेष मामले दुर्घटनाओं। मान लें कि मैं दूसरी गतिविधि लॉन्च करता हूं या इसके ऊपर एक टुकड़ा दबाता हूं जो FIRST के डेटा को संशोधित करता है। अब जब मैं उपरोक्त कोड के साथ गतिविधि/खंड पर वापस जाता हूं तो पहले मुझे FIRST और SECOND के पुराने डेटा के साथ रीफ्रेश करता है, और FIRSTSECOND, SECOND को नए डेटा के साथ पुनः लोड किया गया है। अब FIRST बदल दिया गया है, इसे फिर से लोड किया गया है, जो शुरू करने के लिए SECOND का एक और लोड का कारण बनता है।

सबसे पहले अगर आप गिनती है कि दोनों (एक वर्ष और एक नया) जो कम से कम एक सा बेकार तेजी FIRST का भार और SECOND के तीन भार (दो वर्ष और एक नया), अप करने के लिए योग। मुझे वास्तव में कोई फर्क नहीं पड़ता कि, इसे छोड़कर इसे डीबग करने में परेशानी होती है, लेकिन ऐसा लगता है कि मुझे गैर-निर्धारक व्यवहार करना भी लगता है, क्योंकि आप नहीं जानते कि कौन से भार पहले खत्म हो जाएंगे। FIRST और SECOND के बीच संबंध बदल गया है, या मैं कैश किए गए मानों के साथ समाप्त हो जाएगा, तो क्या मैं SECOND के लिए नए डेटा के साथ समाप्त हो जाऊंगा?

मुझे पता है कि मैं दूसरे लोडर को पुनरारंभ करने के लिए स्कोर रखने के द्वारा इसे कम कर सकता हूं, लेकिन ऐसा करने का एक बेहतर तरीका होना चाहिए।

थोड़ा स्पष्ट करने के लिए: समस्या सबसे प्रमुख है अगर FIRST में पंक्तियों एक भरी हुई SECOND में एक ही पंक्ति (रों) को इंगित नहीं करता FIRST में SECOND में और पंक्ति (यों) वापस नेविगेशन के बाद पंक्तियों को संदर्भ है पहले जैसा।

+0

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

+0

क्या यह सबक्वायरी, जॉइन इत्यादि जैसी चीज नहीं होगी, और क्या यह अन्य प्रश्नों के समान ही अपडेट किया गया है? अर्थात। 'पहले चुनें। आईडी, दूसरा। पहले से पहले दूसरे पर जुड़ें first.id = second.first', जहां पहला या दूसरा संपादित किया गया है, क्या मुझे' लोडर प्रबंधक 'से नया अपडेट मिलेगा? –

+0

विशेष रूप से मैं किस बारे में सोच रहा हूं इसका नमूना: http://sqlfiddle.com/#!5/3dd28/2/0 –

उत्तर

1

यह देखते हुए कि आपका पहला लोडर प्रभावी रूप से आपके दूसरे लोडर के लिए तर्क तैयार करता है, आपको अपने स्वयं के AsyncTaskLoader को उप-वर्ग करना चाहिए और पूरे ऑपरेशन को एक लोडर के भीतर करना चाहिए।

This article में कस्टम AsyncTaskLoader का एक बहुत गहन उदाहरण है, जो मुझे यकीन है कि आप अपनी आवश्यकताओं के अनुरूप हो सकते हैं। खुद को लिखने के तरीके के बारे में बेहतर समझने के लिए आपको CursorLoader source code पर भी देखना चाहिए।

+0

क्या आपका यह मतलब है: http://developer.android.com/reference/android/content/AsyncTaskLoader.html? आपका लिंक टूटा हुआ है। ऐसा लगता है कि आपके पास चीनी साइट या कुछ था। –

+0

हाँ मैंने किया था! माफ़ कीजिये! जब मैं एंड्रॉइड सामान को Google साइट पर चलाता हूं तो सचमुच कोई विचार नहीं है कि – JoeyJubb

+0

किसी कारण से यह मेरे लिए भी करता है। मुझे लगता है कि Google ने अपनी भाषा सेटिंग्स के साथ गुमराह किया है। =) –