2013-02-25 24 views
24

मैं Why use Fragment#setRetainInstance(boolean)?टुकड़ा के setRetainInstance (सही) एक अच्छा अभ्यास का उपयोग कर रहा है वास्तव में रोटेशन परिवर्तन को संभालने के लिए

कारण मैं पूछता हूँ तो Official Activity Documentation जाने के लिए Activity बन्द करते हमें प्रोत्साहित करती है और, रोटेशन को संभालने के लिए Activity के लिए है की चर्चा करते हुए कर रहा हूँ रोटेशन के दौरान पुनरारंभ करें।

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

इस गतिविधि के डिफ़ॉल्ट व्यवहार को बदलने का कोई भी प्रयास खराब अभ्यास प्रतीत होता है। पुनरारंभ करने के दौरान समय लेने वाली डेटा संरचना को पुनः लोड करने से गतिविधि से बचने के लिए, हम onRetainNonConfigurationInstance और getLastNonConfigurationInstance का उपयोग करते हैं। - Official Handling Runtime Changes

हालांकि, जब फ्रैगमेंट में घूर्णन को संभालने की बात आती है, तो क्या Google हमें अलग-अलग सिफारिश देता है? वे नहीं चाहते हैं कि हम चुप रहें और फ्रैगमेंट को पुनरारंभ करें?

public Object onRetainNonConfigurationInstance()

इस विधि एपीआई स्तर 13. उपयोग नया टुकड़ा एपीआई setRetainInstance (बुलियन) के बजाय में पदावनत किया गया था; यह एंड्रॉइड संगतता पैकेज के माध्यम से पुराने प्लेटफॉर्म पर भी उपलब्ध है।

  1. क्यों गूगल को बंद कर दिया और रोटेशन के दौरान गतिविधि को पुनः आरंभ, लेकिन रोटेशन के दौरान टुकड़ा बनाए रखने के लिए हमें प्रोत्साहित करने के लिए हमें प्रोत्साहित करते हैं करता है?
  2. यदि setRetainInstance(true) घूर्णन को संभालने में अच्छा है, तो Google इसे फ्रैगमेंट के डिफ़ॉल्ट व्यवहार के रूप में क्यों नहीं बना सकता?

उत्तर

29
  • विन्यास बदलाव: जब अचानक स्क्रीन बहुत व्यापक और ऊंचाई (ठेठ परिदृश्य) में बहुत कम हो जाता है, यह उपयुक्त है एक दृश्य घटक अपने प्रदर्शन को अपडेट करने के लिए और अधिक समझदारी से स्क्रीन उपलब्ध का उपयोग करने के लिए। कॉन्फ़िगरेशन परिवर्तन का एक अन्य उदाहरण उपयोगकर्ता कीबोर्ड हार्डवेयर स्लाइडिंग, डिवाइस भाषा बदल रहा है, और इसी तरह।क्यों फिर से शुरू:

    • एंड्रॉयड घटकों कथात्मक लेआउट के पक्ष में, तुम वहाँ से एक्सएमएल लेआउट का एक समूह है, और काम लोड। वास्तविक समय में प्रत्येक दृश्य को ढूंढना और पुन: व्यवस्थित करना/अपडेट करना एक गड़बड़ होगा, सभी ईवेंट हैंडलर और अन्य कस्टम व्यू कोड की पुन: तारों का उल्लेख न करें। लेआउट फाइलों का एक और समूह पुनः लोड करना आसान तरीका है।

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

    • राज्य डेटा (मॉडल) को बनाए रखें, न कि इसे प्रदर्शित करने वाली सामग्री (UI और Views)।

  • setRetainInstance (सही): यह केवल सिफारिश की है टुकड़े कि कुछ भी करने के लिए किसी भी संदर्भ पकड़ नहीं है, कि रोटेशन पर बनाई जाएँगी साथ प्रयोग किया जा करने के लिए। इसका मतलब है कि आपको इसका उपयोग किसी भी टुकड़े पर नहीं करना चाहिए जिसमें संदर्भ, दृश्य आदि शामिल हैं। एक सामान्य दृश्य खंड करता है। लेकिन यह टुकड़ों के साथ बहुत उपयोगी है जो चलने वाले थ्रेड, असिनक टास्क, डेटा संग्रह, लोड की गई संपत्ति, परिणाम प्राप्त आदि जैसे ऑब्जेक्ट्स रखते हैं। यह विधि एक गैर-दृश्यमान थैलेमेंट के रूप में एक अलग-अलग धारक के रूप में, एक गतिविधि के गैर संदर्भ-निर्भर वस्तुओं के लिए उपयोग करने में मदद करती है ।

+0

हाँ भूल गया कि दृश्यों के साथ उपयोग करना क्यों स्मार्ट नहीं था लेकिन संदर्भ रिसाव उत्तर है। – Warpzit

+1

** "यह केवल उन टुकड़ों के साथ उपयोग किया जाना चाहिए जो घूर्णन पर पुनर्निर्मित किसी भी चीज का कोई संदर्भ न रखें।" ** मुझे यकीन नहीं है कि यह 100% सटीक है। यदि बनाए रखा खंड 'एक्टिविटीक्रेटेड (बंडल)' में माता-पिता 'गतिविधि' का संदर्भ सेट करता है (जिसे प्रत्येक कॉन्फ़िगरेशन परिवर्तन के बाद बनाए रखा खंड में बुलाया जाएगा), तो यह सुनिश्चित करने के लिए पर्याप्त नहीं होना चाहिए कि बनाए रखा 'फ्रैगमेंट' पुरानी 'गतिविधि' का संदर्भ कभी नहीं रखता है? –

+3

@AlexLockwood यदि आप स्रोत कोड देखते हैं, तो 'FragmentManager' संलग्नक पर अपनी मूल गतिविधि के लिए एक टुकड़े के' mactct'' फ़ील्ड को सेट करता है, और यह ** इसे वापस शून्य पर सेट करता है, जब वह खंड अलग हो जाता है। उस टुकड़े में जो फ़ील्ड 'getActivity()' तक पहुंच योग्य है। तो माता-पिता गतिविधि के लिए एक और संदर्भ संग्रहीत करना हमेशा आवश्यक नहीं होता है, और यदि कोई ऐसा करता है, तो उसे अलग-अलग पर साफ़/रिलीज़ करना होगा। सच है, यदि आप यह सुनिश्चित करने के लिए पर्याप्त सावधान हैं कि आप संदर्भ संदर्भों को रिसाव नहीं करेंगे, तो आप इसे किसी भी तरह से उपयोग कर सकते हैं। मेरा इरादा किसी भी टुकड़े पर 'setReatainInstance() 'के बेकार उपयोग को हतोत्साहित करना था। –

4

क्योंकि आप इसका उपयोग गलत समझ रहे हैं। setRetainInstance(true) केवल उन टुकड़ों में उपयोग किया जाना चाहिए जो एकल तत्व/मॉड्यूल की तरह हैं। फ्रैगमेंट जो सॉकेट आदि को संभालता है, उसके पास जीयूआई को वास्तव में बनाए रखने से लाभ नहीं होता है। जीयूआई के साथ टुकड़े शायद setRetainInstance(true) का उपयोग नहीं करना चाहिए। बैकस्टैक पर जाने वाले किसी भी टुकड़े को setRetainIstance(true) का उपयोग नहीं करना चाहिए।

आप इसे किसी भी खंड में सामान्यीकृत कर सकते हैं जो केवल डेटा/कनेक्शन इत्यादि को संभालने में setRetainInstance(true) का उपयोग करना चाहिए। लेकिन टुकड़ों का उपयोग करने के कई तरीके हैं, जो setRetainInstance(true) का लाभ नहीं उठाएंगे।

+1

कोई भी स्रोत जो आपके विचार का समर्थन करता है? Google एंड्रॉइड प्रलेखन बिल्कुल यूआई और गैर यूआई खंड पर विशिष्ट नहीं है। –

+0

यदि आप setRetainInstance (true) पर googles संदर्भ देखते हैं तो कम से कम बैकस्टैक के साथ काम नहीं करता है। लिंक: http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean) – Warpzit