दिलचस्प पोस्ट
एक संग्रह संग्रह में एक से अधिक संग्रहों का संयोजन करते हैं? इनपुट और आउटपुट के लिए सी फंक्शन में नॉर्मि एरेज़ पास करना सार्वजनिक आईडी और सिस्टम आईडी के बीच सफेद स्थान की आवश्यकता है जावा में "एक्स मिनट, एक्स सेकेंड" में मिलिसेकंड कैसे परिवर्तित करें? कोणीय / आरएक्सजेएस जब मैं `सदस्यता 'से सदस्यता समाप्त करना चाहिए डेल्फी के लिए संपादन / कॉम्बो नियंत्रण की तरह Google? कुशलता से दो तिथियों के बीच समय और तिथियों का यादृच्छिक नमूना उत्पन्न करता है एक पंक्ति में कई बयानों को कैसे रखा जाए? आकार बदलने के साथ ASP.NET छवि अपलोड कैसे मैं "=>" के रूप में लैम्ब्डा अभिव्यक्ति में प्रयोग किया जाता है। नेट दृश्य स्टूडियो 2005 पर बहुत धीमी गति से संकलन करें चेतावनी: DOMDocument :: loadHTML (): htmlParseEntityRef: अपेक्षित ';' इकाई में, इवेंट बबलिंग और एमवीपी: एएसपी.नेट कैसे ठीक से वैश्विक नए और हटाने ऑपरेटरों को बदलने के लिए एसक्यूएल सर्वर चयन करने के लिए JSON फ़ंक्शन

जब एक टुकड़ा को बदल दिया जाता है और पीछे की ढेर (या हटाया गया) में रखता है तो क्या वह स्मृति में रहती है?

क्या क्रियाएं कार्यकलापों की तरह काम करती हैं? क्रियाएँ के साथ उदाहरण के लिए यह इस तरह काम करता है:

गतिविधि ए गतिविधि बी शुरू करता है, जबकि बी स्क्रीन पर है, सिस्टम सिस्टम से आवश्यक होने पर को स्मृति से हटाने में सक्षम होता है। वापस दबाए जाने पर, को स्मृति में दोबारा बनाया जाएगा जैसे कि यह पहली जगह में कभी नहीं छोड़ा गया है

मैंने स्पष्ट किया है कि स्मृति के अनुसार टुकड़े टुकड़े के साथ क्या होता है और कुछ भी नहीं मिला है क्या यह उसी तरह काम करता है? उदाहरण के लिए:

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

जब तक सी सी मार डाली जाती है या क्या यह सिस्टम द्वारा आवश्यकतानुसार निकाला जा सकता है, क्या एफ में स्मृति में रहना चाहिए?

वास्तव में मैं क्या पूछ रहा हूं कि क्या मुझे स्मृति से बाहर होने का खतरा है या नहीं, अगर मेरे पास एक ही गतिविधि में जटिल टुकड़े के पीछे ढेर है?

Solutions Collecting From Web of "जब एक टुकड़ा को बदल दिया जाता है और पीछे की ढेर (या हटाया गया) में रखता है तो क्या वह स्मृति में रहती है?"

इस पर एक नज़र डालें: BackStackRecord.Op.fragment

इस तरह के टुकड़े वापस ढेर में जमा किए जाते हैं। जीवित संदर्भ नोट करें, न तो WeakReference और न ही SoftReference उपयोग किया जाता है वहाँ।

अब यह: फ्रेगमेंट मैनेजर आईएमपीएल.एम.बैकस्टैक्स

यही वह जगह है जहां मैनेजर बैक स्टैक को स्टोर करता है। साधारण ArrayList , भी, कोई डब्लूआरएस या एसआरएस नहीं।

और अंत में यह: गतिविधि.एमएफ़्रैग्मेंट्स

यह टुकड़ा प्रबंधक का संदर्भ है

जीसी केवल ऐसे ऑब्जेक्ट इकट्ठा कर सकती हैं जिनके पास कोई लाइव संदर्भ नहीं है (किसी भी थ्रेड से पहुंच नहीं है)। इसका मतलब है, जब तक आपकी गतिविधि नष्ट नहीं हो जाती ( तब तक , FragmentManager संदर्भ चला जाता है), जीसी वापस ढेर में किसी भी टुकड़े को एकत्र करने में सक्षम नहीं होगा

ध्यान दें कि जब गतिविधि नष्ट हो जाती है और राज्य को बरकरार रखता है (जैसे जब आप डिवाइस को लैंडस्केप मोड में बदलते हैं), तो यह स्टैक में वास्तविक Fragment ऑब्जेक्ट्स को नहीं रखता है, केवल उनके राज्य – फ्रैग्मेंट.फ्रैगमेंटस्टेट ऑब्जेक्ट्स, अर्थात बैक स्टैक में वास्तविक टुकड़े फिर से बनाए गए हर बार गतिविधि को बनाए रखा राज्य के साथ फिर से बनाया गया है

उम्मीद है की यह मदद करेगा।

पुनश्च तो, संक्षेप में: हां, आप स्टेक के पीछे के Fragments को जोड़कर स्मृति के साथ-साथ पदानुक्रम को देखने के लिए बहुत अधिक दृश्य जोड़कर भाग ले सकते हैं।

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

आपको जानकारी के कुछ आधिकारिक स्रोत प्रदान करने में सक्षम नहीं होने के कारण मुझे खेद है, लेकिन मुझे यह भी पता लगाना था कि क्या होगा और इसका परीक्षण करने का निर्णय लिया। और मेरे परीक्षणों के अनुसार, हाँ, आप मेमोरी से बाहर निकलने का जोखिम चलाते हैं

मुझे OutOfMemoryError होने के लिए लूप के लिए एक टुकड़े (एक सौ से अधिक) में अविश्वसनीय राशि जोड़नी OutOfMemoryError , लेकिन ऐसा हुआ। और मेरे लॉग की जांच करते हुए, मैं देख सकता था कि onSaveInstance() onPause() और onSaveInstance() विधियों को कई बार बुलाया गया था लेकिन onSaveInstance() , onPause() और onSaveInstance() बिल्कुल नहीं बुलाया गया था।

संदर्भ के लिए, इस तरह मैं बैकस्टैक के टुकड़ों को जोड़ता हूं:

 getSupportFragmentManager().beginTransaction().add(R.id.scene_fragment_container, mSceneFragment).addToBackStack("FOOBAR").commit(); 

और मैंने जो टुकड़ा जोड़ा था वह कुछ सरल था: एक ImageView ListView , एक SeekBar , एक जोड़ी SeekBar , एक SeekBar और एक ListView

लेकिन जब तक आप मेमोरी में बड़ी मात्रा में डेटा नहीं रखते हैं, यह एक मुद्दा नहीं होना चाहिए।

बाद में मैंने केवल 50 को बैकस्टैक में जोड़ने की कोशिश की, ऐप की हत्या कर उसे पुनरारंभ कर दिया। और जैसा मैं आशा करता / अनुमान onSaveInstance() , सभी टुकड़ों को बहाल किया गया था (और onSaveInstance() और onSaveInstance() कहा जाता है) तो मेरा जीवनचक्र क्रियान्वयन मुद्दा नहीं था जिसके कारण onSaveInstance() को आग लगाना पड़ा।

डेवलपर.android.com/guide/topics/fundamentals/fragments.html से

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

हां, आप एक ही गतिविधि में बहुत अधिक टुकड़े बनाने में स्मृति से बाहर चला सकते हैं। ट्रिगमेंट केवल तभी नष्ट हो जाएगा जब गतिविधि होती है