2012-06-22 15 views
55

मुझे फ्रैगमेंट # सेट रीटेन इंस्टेंस (सत्य) भ्रमित लगता है।फ्रैगमेंट # setRetainInstance (बूलियन) का उपयोग क्यों करें?

सार्वजनिक शून्य setRetainInstance (बूलियन बनाए रखने)

नियंत्रण एक टुकड़ा उदाहरण (जैसे कि एक विन्यास परिवर्तन से के रूप में) गतिविधि फिर से निर्माण भर में बनाए रखा है कि क्या: यहाँ जावाडोक, Android Developer API से निकाली गई है। इसका उपयोग केवल टुकड़ों के साथ किया जा सकता है जो पीछे की ढेर में नहीं हैं। यदि इसे सेट टुकड़ा जीवन चक्र थोड़ा अलग है जब एक गतिविधि से निर्मित किया गया है हो जाएगा:

  • OnDestroy() (, लेकिन onDetach() अभी भी होगा, क्योंकि टुकड़ा अपने वर्तमान गतिविधि से अलग किया जा रहा है) कहा जाता है नहीं किया जाएगा।
  • ऑनक्रेट (बंडल) को बुलाया नहीं जाएगा क्योंकि टुकड़ा फिर से बनाया नहीं जा रहा है।
  • पर अटैच (गतिविधि) और एक्टिविटीक्रेटेड (बंडल) अभी भी कॉल किया जाएगा।

प्रश्न: आप एक डेवलपर के रूप में इस का उपयोग कैसे करूँ, और क्यों यह चीजों को आसान बनाने करता है?

+3

अच्छी जानकारी के साथ समान प्रश्न: [फ्रैगमेंट के सेटरेटिन इंस्टेंस (बूलियन) को समझना] (http://stackoverflow.com/questions/11182180/understanding-fragments-setretaininstanceboolean) –

+1

'ऑनडेस्ट्रॉय()' डिवाइस को कम किया जाएगा मेमोरी –

उत्तर

72

कैसे एक डेवलपर उपयोग इस

कॉल setRetainInstance(true) के रूप में आप कर सकते हैं। मैं आमतौर पर onCreateView() या onActivityCreated() में करता हूं, जहां मैं इसका उपयोग करता हूं।

और यह चीजों को आसान क्यों बनाता है?

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

+0

@ कॉमन्सवेयर - यदि आप किसी गतिविधि में एक नया टुकड़ा बनाते हैं और वह गतिविधि फिर से बनाई जाती है, तो फिर से एक नया टुकड़ा बनाने से कैसे बचें? – Neil

+4

@Neil: देखें कि टुकड़ा मौजूद है (उदा।, 'FindFragmentById() ')। यदि यह मौजूद है तो इसे फिर से न बनाएं। – CommonsWare

+0

@CommonsWare यदि खंड दृश्य और स्मृति उपयोग के साथ थोड़ा भारी है, तो आपको क्या लगता है कि एक अच्छा डेवलपर करना चाहिए? –

41

लंबे समय तक चलने वाले संसाधनों को सॉकेट जैसे खुले रखने में बहुत मददगार है। यूआई-कम खंड है जिसमें ब्लूटूथ सॉकेट के संदर्भ हैं और जब आप फोन को फ़्लिप करते हैं तो आपको उन्हें फिर से कनेक्ट करने की चिंता करने की आवश्यकता नहीं होगी।

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

+0

में मेरी मदद कर सकते हैं उत्कृष्ट टिप, धन्यवाद। –

+0

यह एक अच्छा बिंदु है। – StackOverflowed

+0

अच्छा।लेकिन अगर हमें उन्हें ताज़ा करने की ज़रूरत है तो क्या होगा? –

26

इस उत्तर को बहुत देर से जोड़ा गया, लेकिन मैंने सोचा कि इससे चीजें स्पष्ट हो जाएंगी। मेरे बाद कहो जब setRetainInstance है:

गलत

  • टुकड़ा config परिवर्तन पर फिर से बनाया जाता है। नया इंस्टॉलेशन बनाया गया है।
  • सभी जीवन चक्र विधियों को कॉन्फ़िगर() और ऑनस्ट्रोय() सहित कॉन्फ़िगरेशन परिवर्तन पर बुलाया जाता है।

सही

  • टुकड़ा config परिवर्तन पर फिर से बनाया नहीं मिलता है। समान इंस्टेंस का उपयोग किया जाता है।
  • सभी लाइफसाइकिल विधियों को कॉन्फ़िगरेशन परिवर्तन, एपर्ट से ऑन क्रेट() और ऑनस्ट्रोय() पर कहा जाता है।
  • बैकस्टैक में जोड़े जाने पर एक उदाहरण बनाए रखना काम नहीं करेगा।

यह न भूलें कि उपरोक्त संवादप्रवाहों के साथ-साथ फ्रैगमेंट्स पर भी लागू होता है।

+1

क्या आप बैकस्टैक में जोड़े जाने पर एक उदाहरण बनाए रखने के लिए संदर्भ जोड़ सकते हैं। ? – nmxprime

+1

@nmxprime यहां: http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean) –

+1

बैक-स्टैक में जोड़े जाने पर मैं खंड की स्थिति को कैसे पुनर्स्थापित कर सकता हूं? savedInstanceState शून्य है, और मैं setRetainInstance का उपयोग नहीं कर सकता ... –

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