मैं Why use Fragment#setRetainInstance(boolean)?टुकड़ा के setRetainInstance (सही) एक अच्छा अभ्यास का उपयोग कर रहा है वास्तव में रोटेशन परिवर्तन को संभालने के लिए
कारण मैं पूछता हूँ तो Official Activity Documentation जाने के लिए Activity
बन्द करते हमें प्रोत्साहित करती है और, रोटेशन को संभालने के लिए Activity
के लिए है की चर्चा करते हुए कर रहा हूँ रोटेशन के दौरान पुनरारंभ करें।
एंड्रॉइड: configChanges सूची कॉन्फ़िगरेशन परिवर्तन करता है कि गतिविधि स्वयं को संभाल लेगी। जब रनटाइम पर कॉन्फ़िगरेशन परिवर्तन होता है, तो गतिविधि को बंद कर दिया जाता है और डिफ़ॉल्ट रूप से पुनरारंभ होता है, लेकिन इस विशेषता के साथ कॉन्फ़िगरेशन को घोषित करने से गतिविधि को पुनरारंभ होने से रोक दिया जाएगा। इसके बजाए, गतिविधि चल रही है और इसकी ऑन कॉन्फ़िगरेशन चेंज() विधि कहा जाता है। नोट: इस विशेषता का उपयोग से बचा जाना चाहिए और केवल अंतिम उपाय के रूप में उपयोग किया जाना चाहिए। कॉन्फ़िगरेशन परिवर्तन के कारण पुन: प्रारंभ करने के तरीके के बारे में अधिक जानकारी के लिए कृपया रनटाइम परिवर्तनों को पढ़ें।
इस गतिविधि के डिफ़ॉल्ट व्यवहार को बदलने का कोई भी प्रयास खराब अभ्यास प्रतीत होता है। पुनरारंभ करने के दौरान समय लेने वाली डेटा संरचना को पुनः लोड करने से गतिविधि से बचने के लिए, हम onRetainNonConfigurationInstance
और getLastNonConfigurationInstance
का उपयोग करते हैं। - Official Handling Runtime Changes
हालांकि, जब फ्रैगमेंट में घूर्णन को संभालने की बात आती है, तो क्या Google हमें अलग-अलग सिफारिश देता है? वे नहीं चाहते हैं कि हम चुप रहें और फ्रैगमेंट को पुनरारंभ करें?
public Object onRetainNonConfigurationInstance()
इस विधि एपीआई स्तर 13. उपयोग नया टुकड़ा एपीआई setRetainInstance (बुलियन) के बजाय में पदावनत किया गया था; यह एंड्रॉइड संगतता पैकेज के माध्यम से पुराने प्लेटफॉर्म पर भी उपलब्ध है।
- क्यों गूगल को बंद कर दिया और रोटेशन के दौरान गतिविधि को पुनः आरंभ, लेकिन रोटेशन के दौरान टुकड़ा बनाए रखने के लिए हमें प्रोत्साहित करने के लिए हमें प्रोत्साहित करते हैं करता है?
- यदि
setRetainInstance(true)
घूर्णन को संभालने में अच्छा है, तो Google इसे फ्रैगमेंट के डिफ़ॉल्ट व्यवहार के रूप में क्यों नहीं बना सकता?
हाँ भूल गया कि दृश्यों के साथ उपयोग करना क्यों स्मार्ट नहीं था लेकिन संदर्भ रिसाव उत्तर है। – Warpzit
** "यह केवल उन टुकड़ों के साथ उपयोग किया जाना चाहिए जो घूर्णन पर पुनर्निर्मित किसी भी चीज का कोई संदर्भ न रखें।" ** मुझे यकीन नहीं है कि यह 100% सटीक है। यदि बनाए रखा खंड 'एक्टिविटीक्रेटेड (बंडल)' में माता-पिता 'गतिविधि' का संदर्भ सेट करता है (जिसे प्रत्येक कॉन्फ़िगरेशन परिवर्तन के बाद बनाए रखा खंड में बुलाया जाएगा), तो यह सुनिश्चित करने के लिए पर्याप्त नहीं होना चाहिए कि बनाए रखा 'फ्रैगमेंट' पुरानी 'गतिविधि' का संदर्भ कभी नहीं रखता है? –
@AlexLockwood यदि आप स्रोत कोड देखते हैं, तो 'FragmentManager' संलग्नक पर अपनी मूल गतिविधि के लिए एक टुकड़े के' mactct'' फ़ील्ड को सेट करता है, और यह ** इसे वापस शून्य पर सेट करता है, जब वह खंड अलग हो जाता है। उस टुकड़े में जो फ़ील्ड 'getActivity()' तक पहुंच योग्य है। तो माता-पिता गतिविधि के लिए एक और संदर्भ संग्रहीत करना हमेशा आवश्यक नहीं होता है, और यदि कोई ऐसा करता है, तो उसे अलग-अलग पर साफ़/रिलीज़ करना होगा। सच है, यदि आप यह सुनिश्चित करने के लिए पर्याप्त सावधान हैं कि आप संदर्भ संदर्भों को रिसाव नहीं करेंगे, तो आप इसे किसी भी तरह से उपयोग कर सकते हैं। मेरा इरादा किसी भी टुकड़े पर 'setReatainInstance() 'के बेकार उपयोग को हतोत्साहित करना था। –