2013-03-24 6 views
5

डिज़ाइन प्रश्न मूल रूप से - PreferenceActivity होने पर इसे OnSharedPreferenceChangeListener लागू करना चाहिए या किसी को इस कार्यक्षमता को किसी अन्य वर्ग में परिभाषित करना चाहिए - एक आंतरिक कक्षा में कहें? क्या कोई कारण है कि कोई अन्य दृष्टिकोण पर एक को पसंद करेगा?एंड्रॉइड: ऑनशेयर प्रीफरेंस चेंजलिस्ट को परिभाषित/पंजीकृत किया जाना चाहिए

एक श्रोता को कहां पंजीकृत करना चाहिए? मेरा मतलब है the docs और सामान्य ज्ञान क्रमश: onResume/onPause में पंजीकरण/पंजीकरण रद्द करने के लिए निर्देशित है लेकिन azillionregistrationsonCreate में मुझे आश्चर्य है कि मुझे कुछ याद आ रहा है या नहीं।

इसके अलावा मैं निश्चित नहीं हूं कि पंजीकरण रद्द करने में विफलता (इसलिए here उदाहरण के लिए अपंजीकरण को onStop कहा जाने की गारंटी नहीं है) आवश्यक रूप से एक रिसाव की ओर ले जाएगा। तो अगर मैं उदाहरण के लिए है

class MyPref extends PreferenceActivity implements 
      OnSharedPreferenceChangeListener { 
    SharedPreferences sharedPreferences; 
    // init sharedPreferences 
    onStart(){ 
     sharedPreferences.registerOnSharedPreferenceChangeListener(this); 
    } 
    // no unregistration 
} 

इस MyPref उदाहरण रिसाव चाहेंगे एक बार मैं अपने अन्य गतिविधियों में से एक के लिए वापस जाओ?

आखिरकार - क्या वही विचार OnPreferenceChangeListener पर लागू होंगे?

संपादित करें: उस पर वापस आना मुझे वास्तव में OnPreferenceChangeListener को अनधिकृत करने का कोई तरीका नहीं दिख रहा है - क्या मैं अंधा हूं ??

उत्तर

1

मुझे विश्वास नहीं है कि निजी वरीयता के अलावा श्रोता के लिए किसी विशेष स्थान का पक्ष लेने के किसी भी प्रमुख कारण हैं। Activity इसे लागू करने के लिए, या एक आंतरिक वर्ग का उपयोग करना - या तो अनाम या नहीं - ठीक है।

एकमात्र चीज यह है कि, यदि आप श्रोता के रूप में अपने Activity जैसे मौजूदा ऑब्जेक्ट का उपयोग नहीं कर रहे हैं, तो आपको श्रोता ऑब्जेक्ट का संदर्भ रखना होगा। this answer के अनुसार यदि आप नहीं करते हैं तो कचरा इकट्ठा किया जाएगा (और इस प्रकार वास्तव में कुछ भी नहीं सुनता)।


स्रोत में थोड़ा खोदा करने के बाद, यह SharedPreferencesImpl एक WeakHashMap का उपयोग करता पंजीकृत श्रोताओं (source, लाइनों 72-73, 186-196) को रोकने के लिए, जिसका अर्थ है कि अपंजीकृत करने होगा कारण एक नहीं नाकाम रहने लगता है रिसाव।

जैसा कि आप कहते हैं, दस्तावेज़ onResume()/onPause() का उपयोग करने की सलाह देते हैं; शायद लीक के साथ ऐसा करने के लिए कुछ भी नहीं है, बल्कि पृष्ठभूमि ऐप्स को अनावश्यक प्रसंस्करण करने से रोकने के लिए - फिर भी इसके लायक है!

0

/onResume में पंजीकरण और पंजीकरण रद्द करना कुछ भी नहीं है।

आप इस तरह अपने वर्ग का हिस्सा के रूप में अपने श्रोता की एक अनाम कार्यान्वयन कर सकता है:

[class level] 
... 
OnSharedPreferenceChangeListener mListener = new OnSharedPreferenceChangeListener() { 
    onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
     // your code here 
    } 
}; 
... 
[class level] 

तो आप इसे सेट जहां लागू हो। यदि आप ऐसा करते हैं, तो आपका श्रोता /onResume (जब तक आपका ऐप मारे नहीं जाता है और आपका Activity सबक्लास को फिर से लोड करना होगा) के बीच एक अलग ऑब्जेक्ट के रूप में फिर से बनाया नहीं जाएगा, इसलिए इसे असाइन करना व्यर्थ है, क्योंकि आप हमेशा एक ही वस्तु का संदर्भ लें। दूसरी ओर, यदि आपका ऐप मारा जाता है, तो onCreate फिर से कॉल किया जाएगा।

किसी भीतरी कक्षा को लागू करने के संबंध में, या नहीं, मुझे कोड की बढ़ी हुई सफाई के कारण अज्ञात कार्यान्वयन (ऊपर दिखाया गया) पसंद करना पसंद है - मुझे कक्षा के नामों से परेशान नहीं होना है और कम ब्रैकेट टाइप करें। हालांकि, यह वास्तव में एक वरीयता है, इसलिए जो भी आपको लगता है वह बेहतर है।

+1

पंजीकरण और डी-पंजीकरण_ - क्यों? श्रोता को अपंजीकृत करने की आवश्यकता नहीं होगी? मैंने पूछा रिसाव के बारे में क्या? –

+0

आपको इसे अपंजीकृत करने की आवश्यकता नहीं है। अगर यह ऐप को मारने का फैसला करता है तो सिस्टम बस इसे मार देगा। इसके अलावा, प्रत्येक ऐप अपने स्वयं के वीएम इंस्टेंस में चलता है, जो भी मारे जाते हैं, इसलिए आपको कुछ भी अपंजीकृत करने की आवश्यकता नहीं है और कोई रिसाव नहीं होगा - जब प्रक्रिया मर जाती है तो सभी मेमोरी जारी की जाएंगी (कर्नेल उस पर ध्यान रखेगा) । यही कारण है कि यह अनुशंसा की जाती है कि आप 'ऑन पॉज़' या 'ऑनस्टॉप' में लगातार स्टोरेज में डेटा सहेज लें। हालांकि, यह 'onPause' और 'onResume' के बीच नहीं होता है। – Shade

+0

@Mr_and_Mrs_D, क्या आपको इस प्रश्न का बेहतर उत्तर मिला? यदि हां, तो आप इसका हर किसी के लाभ के लिए उत्तर क्यों नहीं देते? – Shade

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