18

मेरे पास एक फ्रैगमेंट एक्टिविटी (सपोर्ट फ्रैगमेंट्स) है जहां मैं कोड द्वारा टुकड़े बनाते हैं और उन्हें फ्रेमलेआउट में डाल देता हूं। यह सब अभी तक ठीक काम करता है। अब यदि मैं ऐप को वापस लौटाता हूं तो सब कुछ ठीक है जब तक कि सिस्टम मेरी गतिविधि को मारता नहीं है (या मैं डीडीएमएस में स्टॉप बटन के साथ ऐसा करता हूं)। अगर ऐसा होता है तो कुछ भी नहीं कहा जाता है और मेरी गतिविधि मारे जाती है। onDestroy नहीं कहा जाता है।गतिविधि के मारे जाने के बाद टुकड़े बने रहें और

तो जब मैं अपनी ऐप दोबारा खोलता हूं तो सभी टुकड़े अभी भी मौजूद हैं और मुझे NullPointerExeptions मिलते हैं क्योंकि वे अपना काम करने का प्रयास करते हैं। इस ऐप के टुकड़ों में टुकड़े मौजूद नहीं हैं, इसलिए यह मेरे लिए समस्या है।

मुझे बैकस्टैक में उनकी आवश्यकता नहीं है इसलिए मैं उन्हें वहां नहीं डालता और पॉपबैकस्टैक() को उनसे छुटकारा पाने के लिए कॉल नहीं कर सकता।

मैं अपने FragmentManager को ऑन्रेट() में कैसे रीसेट कर सकता हूं या बस यह सुनिश्चित कर सकता हूं कि टुकड़े भी नष्ट हो जाएं?

+0

क्या आपको इसके लिए समाधान मिला है? – Henry

उत्तर

0

यह सुनिश्चित नहीं है कि यह एक ही समस्या है, लेकिन कुछ समय पहले मुझे एक दर्शक में टुकड़ों के साथ समस्या थी जहां टुकड़ा जीवन चक्र विधियों को कभी नहीं बुलाया गया था और समस्या खंड प्रबंधक के साथ थी।

तो, समर्थन के बजाय childFragmentManager का उपयोग करने का प्रयास करें FagmentManager और देखें कि यह आपकी समस्या को हल करता है या नहीं।

+0

यदि आपकी गतिविधि मारे जाती है, तो डिस्ट्रॉय को बुलाया जाता है। और मुझे पूरा यकीन है कि जब आपकी गतिविधि मारे जाती है, तो टुकड़े इसके साथ जाते हैं। आपको क्या लगता है कि आपकी गतिविधि मारे गए? क्या आपको यकीन है कि कुछ भी नहीं है जो आपके टुकड़ों के संदर्भ रखता है? – Christine

+0

समस्या यह है कि ऑनस्ट्राय को निश्चित रूप से बुलाया नहीं जाता है। लेकिन जब क्रिएट को बुलाया जाता है तो मुझे पता है कि यह नष्ट हो गया है। मेरे सभी संदर्भ नष्ट गतिविधि में हैं इसलिए नहीं। – Towlie288

+0

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

2

यह वास्तव में सामान्य हो सकता है। बहुत सारे टुकड़ों को तुरंत चालू करने और नष्ट करने के बजाय, एंड्रॉइड उन्हें चारों ओर रख सकता है। यह विशेष रूप से ViewPagers के साथ होता है।

क्या आप बहुत सारी एक्टिविटी() कॉल या संदर्भ प्राप्त करने वाले कॉल का उपयोग कर रहे हैं? यदि हां, तो बातिल के रूप में

Activity activity = getActivity(); 
if (activity == null) 
{ 
    Log.w("activity null!", "This will cause a crash if you access this variable!"); 
} 

एक और टिप AsyncTasks के लिए बाहर देखने के लिए होगा के रूप में सरल कुछ कर रही द्वारा getActivity() कॉल की जाँच करें। यदि आपके पास इनमें से कोई भी पृष्ठभूमि में चल रहा है, तो आप ट्रैक करना चाहते हैं कि गतिविधि जीवित या मृत है या नहीं। मुझे लगता है कि एंड्रॉइड के बाद के संस्करणों में लाइफसाइक्ल चेक लगाए गए हैं, लेकिन आप एटैच() और ऑनडेट() पर एक बुलियन ध्वज भी रख सकते हैं।

3

खंड का lifecycle गतिविधि की जीवन चक्र के समान है, इसलिए इसे अन्य ऐप्स के लिए स्मृति को सहेजने के लिए सिस्टम द्वारा मार और पुनर्निर्मित किया जा सकता है। इसका मतलब है कि खंड की स्थिति को बचाने और बहाल करने के लिए एक तंत्र है। आपको इसका इस्तेमाल करना चाहिए।

  • सहेजें onSaveInstanceState
  • में टुकड़ा की स्थिति को राज्य पुनर्स्थापित - savedState बंडल (, onCreate, onCreateView आदि) विभिन्न तरीकों में टुकड़ा करने के लिए प्रदान की जाती है

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

3

मैं जानता हूँ कि यह वास्तव में देर हो चुकी है, लेकिन मैं एक ही समस्या है और मैं यहाँ उत्तर

support FragmentPagerAdapter holds reference to old fragments

और यहाँ

ViewPager and fragments — what's the right way to store fragment's state?

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

+2

ध्यान दें कि [केवल-लिंक उत्तर] (http://meta.stackoverflow.com/tags/link-only-answers/info) निराश हैं, इसलिए SO के लिए खोज का अंत बिंदु होना चाहिए एक समाधान (बनाम अभी तक संदर्भों का एक और स्टॉपओवर, जो समय के साथ पुराना हो जाता है)। लिंक को संदर्भ के रूप में रखते हुए, यहां स्टैंड-अलोन सारांश जोड़ना पर विचार करें। – kleopatra

+1

वे लिंक वास्तव में बहुत विस्तार से समझाते हैं। महान जवाब – Smeet

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