2009-11-07 15 views
8

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

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

इस ऐप का मेरा प्रारंभिक कार्यान्वयन पहली गतिविधि में सभी यात्राओं को उतारना था, फिर उन्हें ट्रिपएक्टिविटी के लिए मूल्य (इरादे में अतिरिक्त के रूप में) पास करना था। तब TripActivity फ्लाइट एक्टिविटी के लिए अलग-अलग उड़ानें पास करता है, और इसी तरह।

इस समस्या में यह है कि ऐप को धारावाहिक और deserializes जबकि गतिविधियों के बीच एक उल्लेखनीय विराम है। हम कई सेकंड बात कर रहे हैं। जब मेरा पेड़ सीरियलाइजेशन या पार्ससेलबल का उपयोग डेटा पास करने के लिए करता है तो विराम काफी ध्यान देने योग्य होता है। Google के पार्सेलिएबल का उपयोग करने के साथ प्रारंभिक प्रदर्शन परीक्षण क्रमशः क्रमशः 30% गतिशीलता दिखाता है, लेकिन पार्सेलबल के साथ काम करना मुश्किल होता है और सर्कुलरेशन की तरह सर्कुलर ऑब्जेक्ट संदर्भों को संभालने में प्रतीत नहीं होता है, और इसके अलावा अभी भी लगभग कई सेकंड तक रुक जाता है, इसलिए मैंने उस प्रयोग को बैकबर्नर पर रखा है जबकि मैं अन्य चीजों को आजमाता हूं।

तो मैंने ऑब्जेक्ट्स के पेड़ को सीधे एप्लिकेशन क्लास में ले जाने की कोशिश की। जब भी इसकी आवश्यकता होती है तो प्रत्येक गतिविधि को सीधे ऐप से पेड़ मिल जाता है। यह प्रदर्शन को बहुत ही आकर्षक बनाता है, लेकिन अनपेक्षित गतिविधि जैसे कोने के मामलों को संभालने/रोकता है (या तो गतिविधि दुर्घटनाओं के कारण या क्योंकि गतिविधि को अस्थायी रूप से अधिक स्मृति उपलब्ध कराने के लिए बंद कर दिया गया है, या जो भी अन्य कारण है) मुश्किल लगता है। शायद यह onSaveInstanceState() को लागू करने से अधिक नहीं है, मुझे यकीन नहीं है, लेकिन समाधान थोड़ा हैकी लगता है इसलिए मैंने अभी तक और जांच नहीं की है।

तो कम कोबल्ड-एक साथ समाधान की खोज में, मैंने अपनी ऑब्जेक्ट्स को स्टोर और पुनर्प्राप्त करने के लिए कस्टम सामग्री प्रदाता बनाने की कोशिश की। चूंकि ContentProviders को multiprocess=true का उपयोग करके इन-प्रोसेस चलाने के लिए कॉन्फ़िगर किया जा सकता है, इसलिए मैंने सोचा था कि एप्लिकेशन ऑब्जेक्ट में डेटा संग्रहीत करने से कुछ और "मानक" करते समय क्रमिकरण लागत से बचने का एक शानदार तरीका होगा। हालांकि, कंटेंटप्रोवाइडर स्पष्ट रूप से मनमानी ऑब्जेक्ट प्रकारों को वापस करने का इरादा नहीं रखते थे - वे केवल संख्याओं, तारों, बूलियन इत्यादि जैसे प्रकारों का समर्थन करते हैं। ऐसा प्रतीत होता है कि मैं ContentResolver.getContentProviderClient().getLocalContentProvider() का उपयोग करके और मेरी कस्टम कक्षा तक सीधे उपयोग करके मनमानी वस्तुओं को स्टोर करने के लिए एक को जोड़ सकता हूं, लेकिन मैं मुझे यकीन नहीं है कि एप्लिकेशन ऑब्जेक्ट में डेटा संग्रहीत करने से कम हैकी है।

निश्चित रूप से किसी को इस समस्या का अच्छा समाधान होना चाहिए। मैं क्या गलत कर रहा हूं?

उत्तर

3

FiXedd के समाधान के अतिरिक्त, एक और स्थानीय सेवा का उपयोग करना है। सेवा को "स्वयं" ऑब्जेक्ट्स के साथ, सेवा एपीआई को कॉल करने वाली गतिविधियों के साथ जो कुछ भी चाहिए उसे प्राप्त करने के लिए। यह जानकारी डेटा को लाने और पार्स करने के लिए ज़िम्मेदार भी हो सकती है, जो तर्क के उस बिट को घेर लेती है।

Application ऑब्जेक्ट एंड्रॉइड घटकों का "लाल-सिर वाला कदम-बच्चा" है।कोर एंड्रॉइड टीम के सदस्य कस्टम Application सबक्लास बनाने के अभ्यास के खिलाफ बाहर आ गए हैं, हालांकि यह निश्चित रूप से एपीआई द्वारा समर्थित है। एक एडीसी 2 200 एप्लिकेशन इंजीनियर किया गया जिसने एक कस्टम Application सबक्लास का लाभ उठाया, मैं कह सकता हूं कि मुझे अपने मामले में भी एक सेवा के साथ जाना चाहिए था। लाइव और जानें ...

स्थानीय बाध्यकारी पैटर्न का उपयोग करके, आपकी सेवा स्वचालित रूप से आवश्यकतानुसार बनाई और नष्ट हो जाएगी, इसलिए आपको इसके बारे में चिंता करने की ज़रूरत नहीं है। और, परिभाषा के अनुसार, एक स्थानीय सेवा एक ही प्रक्रिया/वीएम में आपकी गतिविधियों के रूप में चलती है, इसलिए आपको ContentProvider परिदृश्य में जैसे मार्शल ओवरहेड के बारे में चिंता करने की ज़रूरत नहीं है।

+0

हाँ, मुझे लगता है कि मैं एक समान नाव में हूं। आवेदन में सबकुछ करना शुरू कर दिया, और अब एक सेवा जाने का सही तरीका दिखती है। मैं किसी बिंदु पर refactoring की जांच करेंगे। पारितोषिक के लिए धन्यवाद! – emmby

+0

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

1

जिस तरह से मैं इसे अपने ऐप्स में से एक में संभालने का तरीका डेटा डाउनलोड कर रहा हूं और उसे डेटाबेस में बदल रहा हूं। इस तरह मुझे उन सभी वस्तुओं को चारों ओर ले जाने की ज़रूरत नहीं है (जो, आईआईआरसी, ऑब्जेक्ट इंस्टेंटेशन के लिए केवल 1kb प्रत्येक खाते हैं) और मैं आसानी से केवल उस डेटा को खींच सकता हूं जिसकी मुझे आवश्यकता है। मुझे नहीं पता कि यह आपके लिए काम करेगा या नहीं, लेकिन यह मेरे उपयोग के मामले में काम करता है।

+0

हमने अपनी वर्तमान नौकरी पर यह कोशिश की, लेकिन जब हमने डाटाबेस में डेटा को पढ़ने या स्टोर करने का प्रयास किया तो ऐप फ्रीजिंग और/या क्रैश हो रहा था। मैं अब से SQLite डेटाबेस से दूर रहने की कोशिश कर रहा हूं ... –

0

डेटा ऑब्जेक्ट को साझा प्राथमिकता फ़ाइल में सहेजने का एक और तरीका होगा। इस तरह हमने अपने ऐप्स में से एक को कार्यान्वित किया, लेकिन मुझे उस दृष्टिकोण को पसंद नहीं आया क्योंकि यह बहुत धीमा लगता है।

यह खराब कोडिंग अभ्यास है, लेकिन सबसे तेज़ तरीका डेटा को पार्स करने के लिए एक सेवा का उपयोग करना और डेटा को एक स्थिर वर्ग में सहेजना है जिसका उपयोग आप बाकी ऐप के जीवन के लिए कर सकते हैं।

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