2011-12-30 21 views
5

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

मैंने पहले ही पढ़ा है कि इस समस्या को कैसे हल किया जा सकता है, हालांकि मैंने अभी भी "प्रभावी जावा" पढ़ा है। ऐसा कहा जाता है कि "सिंगल-एलिमेंट एनम टाइप एक सिंगलटन को लागू करने का सबसे अच्छा तरीका है"।

तो अब मैं सोच रहा हूं कि एंड्रॉइड एप्लिकेशन में सिंगलटन का जीवन चक्र किस तरह से बनाया जाएगा? क्या यह "मानक सिंगलटन कार्यान्वयन" के मामले में समान होगा जैसा कि गतिविधि को नष्ट करने के बाद से पहली बार इसे नष्ट कर दिया जाएगा (भले ही यह अन्य गतिविधियों में भी उपयोग किया जाता है)?

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

+0

सिंगलटन सामान्य रूप से एक विरोधी पैटर्न है। अगर आपको वास्तव में कुछ की आवश्यकता है, तो बस एक और मत बनो।: पी – cHao

+0

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

+0

@ जेन्स मैंने अपना प्रश्न अपडेट किया है। – mmatloka

उत्तर

2

सभी मामलों में, कक्षाओं आप उपयोग ClassLoader है कि उन्हें लोड से बंधी हैं। सामान्य रूप से जावा में यह सच है, न केवल एंड्रॉइड। एंड्रॉइड प्रत्येक ClassLoader एस का उपयोग करके गतिविधियों को अलग करेगा - कम से कम, यह वादा नहीं करता है कि यह नहीं होगा, और यह कहां तक ​​मैं कह सकता हूं।

कोई सिंगलटन, या अन्य क्लास-स्तरीय राज्य Class से जुड़ा हुआ है जो ClassLoader से जुड़ा हुआ है। यही कारण है कि आपका राज्य "गायब हो जाता है"; वास्तव में यह है कि आपका कॉलिंग कोड एक नए Class को एक नए ClassLoader में देख रहा है।

तो, आपकी enum- आधारित चाल, या इन पंक्तियों के साथ कुछ भी, बिल्कुल वही व्यवहार होगा। आप इस तरह गतिविधि गतिविधि को "जारी" नहीं कर सकते हैं। आप एक SQLite डीबी को लिख और लिखना चाहिए। आप शायद इसे SharedPreferences में भी छीन सकते हैं।

-2

मेरे सुरक्षित सिंगलटन कार्यान्वयन कि तरह है:

मैं एक सिंगलटन वर्ग जो बूलियन 'didReceiveMemoryWarning' की एक विशेषता है बनाएँ;

public class SingleTon(){ 
    public boolean didReceiveMemoryWarning = true; 
    ... 
    ... 
} 

आवेदन पहले स्क्रीन में (यह बिल्कुल पहले प्रक्षेपण स्क्रीन है)

SingleTon.getInstance().didReceiveMemoryWarning = false; 

और हर गतिविधि की OnCreate() विधि में, इस बूलियन जाँच (मैं एक स्प्लैश स्क्रीन कि दिख रहा है 3 सेकंड है) डेटा,

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if(SingleTon.getInstance().didReceiveMemoryWarning){ 
      { Load your data from local to your SingleTon class, 
      because your app was released by OS}; 
    } 
} 

यह मेरा कार्यान्वयन है।

+0

यह सिर्फ एक सिंगलटन है। वह कह रहा है कि यह काम नहीं करता है। –

0

एप्लिकेशन ऑब्जेक्ट ऐसी जानकारी संग्रहीत करने के लिए एक अच्छा स्थान है जिसे विभिन्न गतिविधि या सेवा उदाहरणों तक पहुंच योग्य होना आवश्यक है। आप इसे इस तरह से पुनर्प्राप्त कर सकते हैं (जहां यह एक गतिविधि या सेवा है):

निजी MyAplication ऐप;

ऑनक्रेट (...) { ... this.app = (MyAplication) this.get आवेदन(); ... }

प्रकट में भी नाम सेट करना न भूलें: "आवेदन" टैग के गुण "नाम" सेट करें: मूल्य आपके एप्लिकेशन का पैकेज करने के लिए वर्ग रिश्तेदार के लिए पथ है।

ऐप शुरू होने पर एप्लिकेशन ऑब्जेक्ट बनाया जाता है, तो आप इसे चालू या क्रिएट() विधि में किसी गतिविधि या सेवा में प्रारंभ कर सकते हैं।

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

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