मेरे पास एक साधारण एंड्रॉइड एप्लिकेशन है जो एक वर्ग के उदाहरण का उपयोग करता है, चलिए इसे DataManager कहते हैं, डोमेन कक्षाओं तक पहुंच को Façade- जैसे तरीके से प्रबंधित करने के लिए। मैंने शुरुआत में इसे सिंगलटन के रूप में डिजाइन किया था जिसे स्थिर तरीकों का उपयोग करके पुनर्प्राप्त किया जा सकता था लेकिन अंततः मैं अपने कार्यान्वयन की गड़बड़ी से परेशान हो गया और जो मैंने माना वह एक सरल और साफ विचार था।

अब विचार यह है कि खोली गई प्रत्येक फ़ाइल के लिए, एक DataManager बनाया जाता है, जिसे वे फ़ाइल I/O और डोमेन वर्गों के संशोधन (जैसे Book) दोनों को संभालते हैं। एक नई गतिविधि शुरू करते समय, मैं इस एक उदाहरण को Serializable अतिरिक्त के रूप में पास करता हूं (मैंने अभी तक Parcelable का उपयोग नहीं किया है, लेकिन उम्मीद है कि जब मेरे पास मूल अवधारणा काम करेगी), और फिर मैं नई गतिविधि की onCreate() विधि में Intent से DataManager लेता हूं।

फिर भी वस्तुओं की तुलना इंगित करती है कि एक गतिविधि से भेजी गई वस्तु दूसरी गतिविधि में Bundle से प्राप्त वस्तु के समान (विभिन्न संदर्भ) नहीं है। Bundle (StackOverflow, आदि पर) को पढ़ने से पता चलता है कि बंडल पास-बाय-वैल्यू के अलावा और कुछ नहीं कर सकते।

तो गतिविधियों के बीच किसी वस्तु को पारित करने के लिए सबसे साफ और सुरक्षित रणनीति क्या हो सकती है? जैसा कि मैं देख सकता था मैं कर सकता था

  1. संदर्भ से गुजरने के बारे में भूल जाओ और प्रत्येक Activity के साथ अपना डेटा प्रबंधक ऑब्जेक्ट रखें। हर बार जब मैं कोई गतिविधि बंद करता हूं तो नया DataManager वापस पास करें ताकि अंतर्निहित गतिविधि उसका उपयोग कर सके। (सरल समाधान, मुझे लगता है।)

  2. सिंगलटन DataManager का उपयोग करने के लिए वापस जाएं और इसे प्रत्येक Activity से प्राप्त करने के लिए एक स्थिर विधि का उपयोग करें। (सिंगलटन का फिर से उपयोग करने के इच्छुक नहीं हैं।)

  3. DataManager के लिए एक प्रकार का वैश्विक संदर्भ बनाने के लिए एप्लिकेशन का विस्तार करें। (फिर, ग्लोबल्स के विचार के लिए उत्सुक नहीं।)

क्या यह उचित सारांश है? क्या कोई अन्य स्वस्थ रणनीति है जिसका मैं उपयोग कर सकता हूं?

5
Spinner 19 अगस्त 2011, 16:51

5 जवाब

सबसे बढ़िया उत्तर

एक और तरीका एक सेवा बनाना होगा। पहली गतिविधि सेवा शुरू करेगी और उससे जुड़ जाएगी, जब आप एक नया इरादा लॉन्च करेंगे, तो पहली गतिविधि को अनबाइंड करें और जब दूसरी गतिविधि शुरू हो, तो सेवा से जुड़ें।

इस तरह आपको कभी भी सेवा बंद करने या गतिविधियों के बीच डेटा पास करने की चिंता करने की ज़रूरत नहीं है।

4
Ljdawson 19 अगस्त 2011, 16:58

जावा पास संदर्भ से नहीं है, इसलिए विकल्प समाप्त हो गया है, मैं गतिविधियों के बीच डेटा पास करने के लिए निर्भरता इंजेक्शन का सुझाव दूंगा। अन्यथा निश्चित रूप से सिंगलटन जाने का रास्ता होगा।

0
Oscar Gomez 19 अगस्त 2011, 16:55

निर्धारित एक पार्सलेबल इंटरफ़ेस को लागू करके जा रहा है, यह गतिविधियों के बीच वस्तुओं को पारित करने का तरीका है .. और दूसरा और बेहतर विकल्प सिंगलटन को अपनी एकल वस्तु सुनिश्चित करने के लिए बनाना है।

0
ngesh 19 अगस्त 2011, 16:56

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

यदि आपको बहुत अधिक डेटा प्राप्त करने की आवश्यकता है, तो पार्सलेबल तर्कों को पारित करना बहुत जल्दी गड़बड़ हो सकता है। सिंगलटन दृष्टिकोण, हालांकि आमतौर पर एक विरोधी पैटर्न माना जाता है, ऐसे मामलों में एक आकर्षण की तरह काम करता है। बस याद रखें कि एक दूसरे के साथ इंटरैक्ट करने वाले कई सिंगलटन न बनाएं।

0
Jes 19 अगस्त 2011, 17:06

मैं एक एप्लिकेशन सबक्लास का उपयोग करने का सुझाव दूंगा। यह आपको DataManger वर्ग के लिए एकल संदर्भ रखने की अनुमति देता है और जब तक आपका ऐप रहता है तब तक यह लगातार बना रहता है।

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

उसने आपके दो रूपों के बारे में कहा।

Android का तरीका यह होगा कि आप अपने DataManager को ContentProvider बना दें। . यह वैश्विक संदर्भ रखे बिना प्रत्येक गतिविधि से आपके डेटा तक पहुंच बनाना संभव बना देगा। मुझे यकीन नहीं है कि आप एक कैशिंग सामग्री प्रदाता कैसे बनाएंगे जो स्मृति में रहता है और जिसे अक्सर बहाल नहीं किया जाता है।

0
Janusz 19 अगस्त 2011, 17:46