यह एक प्रश्न है जो मैंने अभी बनाया है कुछ अलग-अलग ऐप्स के लिए, और मुझे अभी तक किसी भी समाधान के साथ सब्सिडीबद्ध नहीं हुआ है। मैंने सोचा कि मैं वहां अन्य समाधान देखने के लिए समुदाय में इसे बाहर रखूंगा।एंड्रॉइड में गतिविधियों के बीच वस्तुओं के एक जटिल पेड़ को साझा करने के लिए अच्छे विकल्प?
मान लीजिए कि आपके पास ऐसी गतिविधि है जो डेटा के जटिल पेड़ को डाउनलोड करती है (इस मामले में जेसन के माध्यम से, लेकिन यह कुछ भी हो सकती है), जावा वस्तुओं के एक सेट पर डेटा को अनारश करता है (इस मामले में जीसन का उपयोग करते हुए, लेकिन फिर से, जो भी हो सकता है), फिर उस डेटा के विभिन्न हिस्सों को देखने के लिए अतिरिक्त गतिविधियों को जन्म देता है। आपकी प्रतिक्रिया में यात्राएं देखने के लिए एक गतिविधि हो सकती है, और दूसरा उन यात्राओं में उड़ानें देखने के लिए और शायद अन्य उड़ानों के यात्रियों को देखने के लिए हो सकता है।
इस ऐप का मेरा प्रारंभिक कार्यान्वयन पहली गतिविधि में सभी यात्राओं को उतारना था, फिर उन्हें ट्रिपएक्टिविटी के लिए मूल्य (इरादे में अतिरिक्त के रूप में) पास करना था। तब TripActivity फ्लाइट एक्टिविटी के लिए अलग-अलग उड़ानें पास करता है, और इसी तरह।
इस समस्या में यह है कि ऐप को धारावाहिक और deserializes जबकि गतिविधियों के बीच एक उल्लेखनीय विराम है। हम कई सेकंड बात कर रहे हैं। जब मेरा पेड़ सीरियलाइजेशन या पार्ससेलबल का उपयोग डेटा पास करने के लिए करता है तो विराम काफी ध्यान देने योग्य होता है। Google के पार्सेलिएबल का उपयोग करने के साथ प्रारंभिक प्रदर्शन परीक्षण क्रमशः क्रमशः 30% गतिशीलता दिखाता है, लेकिन पार्सेलबल के साथ काम करना मुश्किल होता है और सर्कुलरेशन की तरह सर्कुलर ऑब्जेक्ट संदर्भों को संभालने में प्रतीत नहीं होता है, और इसके अलावा अभी भी लगभग कई सेकंड तक रुक जाता है, इसलिए मैंने उस प्रयोग को बैकबर्नर पर रखा है जबकि मैं अन्य चीजों को आजमाता हूं।
तो मैंने ऑब्जेक्ट्स के पेड़ को सीधे एप्लिकेशन क्लास में ले जाने की कोशिश की। जब भी इसकी आवश्यकता होती है तो प्रत्येक गतिविधि को सीधे ऐप से पेड़ मिल जाता है। यह प्रदर्शन को बहुत ही आकर्षक बनाता है, लेकिन अनपेक्षित गतिविधि जैसे कोने के मामलों को संभालने/रोकता है (या तो गतिविधि दुर्घटनाओं के कारण या क्योंकि गतिविधि को अस्थायी रूप से अधिक स्मृति उपलब्ध कराने के लिए बंद कर दिया गया है, या जो भी अन्य कारण है) मुश्किल लगता है। शायद यह onSaveInstanceState()
को लागू करने से अधिक नहीं है, मुझे यकीन नहीं है, लेकिन समाधान थोड़ा हैकी लगता है इसलिए मैंने अभी तक और जांच नहीं की है।
तो कम कोबल्ड-एक साथ समाधान की खोज में, मैंने अपनी ऑब्जेक्ट्स को स्टोर और पुनर्प्राप्त करने के लिए कस्टम सामग्री प्रदाता बनाने की कोशिश की। चूंकि ContentProviders को multiprocess=true
का उपयोग करके इन-प्रोसेस चलाने के लिए कॉन्फ़िगर किया जा सकता है, इसलिए मैंने सोचा था कि एप्लिकेशन ऑब्जेक्ट में डेटा संग्रहीत करने से कुछ और "मानक" करते समय क्रमिकरण लागत से बचने का एक शानदार तरीका होगा। हालांकि, कंटेंटप्रोवाइडर स्पष्ट रूप से मनमानी ऑब्जेक्ट प्रकारों को वापस करने का इरादा नहीं रखते थे - वे केवल संख्याओं, तारों, बूलियन इत्यादि जैसे प्रकारों का समर्थन करते हैं। ऐसा प्रतीत होता है कि मैं ContentResolver.getContentProviderClient().getLocalContentProvider()
का उपयोग करके और मेरी कस्टम कक्षा तक सीधे उपयोग करके मनमानी वस्तुओं को स्टोर करने के लिए एक को जोड़ सकता हूं, लेकिन मैं मुझे यकीन नहीं है कि एप्लिकेशन ऑब्जेक्ट में डेटा संग्रहीत करने से कम हैकी है।
निश्चित रूप से किसी को इस समस्या का अच्छा समाधान होना चाहिए। मैं क्या गलत कर रहा हूं?
हाँ, मुझे लगता है कि मैं एक समान नाव में हूं। आवेदन में सबकुछ करना शुरू कर दिया, और अब एक सेवा जाने का सही तरीका दिखती है। मैं किसी बिंदु पर refactoring की जांच करेंगे। पारितोषिक के लिए धन्यवाद! – emmby
मैं भी सेवा पसंद करता हूं। "खुद" से आपका क्या मतलब है? क्या आप डेटा को डेटा में एक स्थिर वस्तु में सहेजते हैं? आम तौर पर एक सेवा डेटा को पार्स कर देती है और उसके बाद उस डेटा को प्रसारण में भेजती है, और तब डेटा को प्रदर्शित करने के लिए यूआई थ्रेड में एक हैंडलर का उपयोग किया जाएगा। लेकिन अगर मैं फिर से सेवा कहता हूं, तो सेवा उस डेटा को फिर से कहां मिलती है? क्या यह डेटा सेवा में एक स्थिर वस्तु में सहेजा गया है? हम जेएसओएन को फिर से पार्स नहीं करना चाहते हैं .. –