2012-02-16 12 views
12

मैं फ्रैगमेंट्स और लोडर मैनेजर का उपयोग कर रहा हूं। मुझे एक अज्ञात संख्या में कार्य लॉन्च करना है, और वे समानांतर में चल सकते हैं (अन्यथा मैं केवल एक और केवल एक लोडर का पुन: उपयोग करता हूं)। उदाहरण के लिए, मेरे पास एक सूचीदृश्य है, और प्रत्येक पंक्ति में उस पंक्ति की सामग्री को वेबसर्वर पर सहेजने के लिए एक बटन हो सकता है। उपयोगकर्ता समानांतर में एकाधिक वस्तुओं पर एक सेव अनुरोध शुरू कर सकता है।लोडरमेनर के साथ एकाधिक लोडर के लिए पैटर्न?

private int nextId = 0; 

private void onClickListener() { 
    Bundle bundle = new Bundle(); 
    bundle.putNextData(...); 
    getLoaderManager().initLoader(nextId++, bundle, this); 
} 

मैं अपने आप को बहीखाता की कोशिश कर सकते हैं, तो मैन्युअल रूप से लोडर का एक पूल बनाने और उन्हें पुन: उपयोग जब संभव हो, लगता है जैसे कि यह कुछ पहले से ही एपीआई द्वारा कार्यान्वित किया जा सकता है?

धन्यवाद

+1

अच्छा सवाल। क्या आपने इसे हल करने का प्रबंधन किया था? मुझे लगता है कि आपको किसी भी तरह अपने कार्यों को कतारबद्ध करना चाहिए। –

उत्तर

4

मुझे नहीं लगता कि आप एक दूरस्थ सर्वर से डेटा को बचाने के लिए एक लोडर का उपयोग करना चाहिए है।

इसके बजाय, IntentService या "सेव" संचालन की कतार को संसाधित करने के समान कुछ उपयोग करें। इस तरह, वेब सर्वर के साथ आपका संचार बैच किया जा सकता है, ध्वस्त हो गया है (यानी एक पंक्ति के लिए एकाधिक कतार बचाया जा सकता है एक ऑपरेशन में ध्वस्त हो सकता है), और यदि आवश्यक हो तो आपकी गतिविधि के जीवनकाल से परे रहेंगे।

एक एक IntentService (या समतुल्य) द्वारा कार्रवाई की कतार भी एक शानदार तरीका, backoff साथ विफल परिचालन फिर से प्रयास करने के बाद आप AlarmManager का उपयोग कर घातीय backoff साथ देरी पुनः लागू कर सकते हैं है सहेजें।

+0

और यदि मेरे पास डेटाबेस में 'n' श्रेणियां हैं और मैं उन्हें 'कर्सर लोडर' का उपयोग करके लोड करना चाहता हूं। मुझे किस आईडी का उपयोग करना चाहिए? – pixel

+1

आप निश्चित रूप से मनमानी आईडी का उपयोग कर सकते हैं, और संभवतः केवल पूर्णांक 1.। यदि श्रेणियां स्थिर हैं। यदि आप पहली बार श्रेणियों की सूची लोड कर रहे हैं और फिर प्रत्येक श्रेणी के विवरण तो आपको शायद अपनी क्वेरी को अनुकूलित करने की आवश्यकता है। लेकिन मान लीजिए कि आपके पास कोई दूसरा विकल्प नहीं है, आपको स्थिर आईडी को लोडर आईडी के रूप में उपयोग करना चाहिए, उदाहरण के लिए नहीं। कर्सर की स्थिति। –

1

एक इरादा सेवा या बाध्य सेवा हमेशा इसके लिए अच्छे दृष्टिकोण हैं। रोमन अंक के रूप में, ध्यान दें कि कई अनुरोधों को घेरने और उन्हें अलग से बुलाया जाने की अत्यधिक अनुशंसा नहीं की जाती है (यह बहुत संभावना है कि आप रेडियो कनेक्शन पर बहुत अधिक काम करते हैं - डेटा का उपयोग करते समय - जो अन्य चीजों के साथ आपकी बैटरी को निकाल देता है। यहां must-read है इसके बारे में)

मैं व्यक्तिगत रूप से अनुरोधों की कतार और उपलब्ध थ्रेड के पूल के साथ एक बाध्य सेवा का उपयोग करने की अनुशंसा करता हूं (वह दृष्टिकोण आपको आपके मामले में अधिक जटिल नेटवर्क संचालन के लिए पूर्ण नियंत्रण देता है)। दृष्टिकोण here और here पर एक टेस्टकेस कार्य उदाहरण पर अधिक जानकारी हैं।

हमें अपनी प्रगति के बारे में अपडेट करें।

0

आप सही दिशा में हैं, मुझे बस आपकी मदद करने दें।

पुन: उपयोग वास्तव में एक अच्छा विचार है, और आप क्योंकि Android आप के लिए यह किया इसके बारे में चिंता करने की जरूरत नहीं (या जावा वास्तव में;)

यह ThreadPoolExecuter कहा जाता है, के रूप में आप चाहते हैं आप के रूप में कई कार्यों को शुरू कर सकते हैं और वह केवल पूर्वनिर्धारित धागे को खोल देगा। (सर्वश्रेष्ठ अभ्यास डिवाइस पर समानांतर नेटवर्क कनेक्शन चलाने के रूप में कई धागे खोलने की कोशिश कर रहा है। मेरे शोध से यह 4 - 9 के बीच है)।

और यदि आप दो बार एक ही यूआरएल डाउनलोड करने की कोशिश कर रहे हैं तो आप अपने आप की रक्षा कर सकते हैं और इसके लिए केवल एक ही कार्य खोल सकते हैं।

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