दिलचस्प पोस्ट
दो तिथियों के बीच कितने सेकेंड्स हैं? UIImagePickerController में सेना के लैंडस्केप अभिविन्यास Response.StatusCode सेट करते समय IIS7 कस्टम एरोर्स ओवरराइड करता है? MySQL को एसक्यूलाइट में कनवर्ट करें केवल गैर-रिक्त स्थान परिवर्तन जोड़ें विज़ुअल स्टूडियो "त्वरित घड़ी" उपकरण और लैम्ब्डा भावों को डीबग करना क्या चिंताओं को अलग करना है? क्यों नहीं सामान्य अपवाद पकड़ JavaFX – छवि के साथ कस्टम बटन बनाएं अगर वस्तु मौजूद है, या कोई भी नहीं है तो मैं ऑब्जेक्ट कैसे प्राप्त करूं? मैं दशमलव के साथ एक स्ट्रिंग को डबल में कैसे पार्स कर सकता हूं? क्रोम ऑटोफिल अक्षम करना पायथन में युग (यूनिक्स टाइम) के बाद से मैं डेटेट ऑब्जेक्ट को मिलीसेकंड में कैसे रूपांतरित कर सकता हूं? GetExternalFilesDir और getExternalStorage डायरेक्टरी के बीच अंतर () कस्टम सदस्यताप्रदाता को .NET 4.0 में

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

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

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

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

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

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

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

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

इस पर एक नज़र डालें: 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 से

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

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