2013-09-25 10 views
10

मैं एक तकनीकी उत्तर की तलाश में हूं कि कैसे एंड्रॉइड रोबोपिस लाइब्रेरी गतिविधि जीवन चक्र का प्रबंधन करती है। आने शुरू हो गए पृष्ठ से:।रोबोपिसिस गतिविधि जीवन चक्र का प्रबंधन कैसे करता है?

https://github.com/octo-online/robospice/wiki/Starter-Guide

"अपनी गतिविधि (या अन्य संदर्भ) के एक आंतरिक वर्ग के रूप में, एक RequestlListener कि आपके यूआई अद्यतन करेगा जोड़ने मेमोरी लीक के बारे में चिंता मत करो, RoboSpice अपनी गतिविधि का प्रबंधन करता है जीवन चक्र।"

मेरा सवाल यह है कि रोबॉस्पिस स्वचालित रूप से अनुरोध श्रोताओं को कैसे अपडेट करता है ताकि यह अभी भी एक रोटेशन के बाद सही संदर्भ के साथ सही श्रोता को कॉल करने में सक्षम हो और गतिविधि को नष्ट कर दिया गया हो और एक नया उदाहरण के रूप में बनाया गया हो?

मैं स्रोत कोड के इंजीनियर को बदलने की कोशिश कर दिया गया है, लेकिन अभी तक एक जवाब नहीं मिला है:

https://github.com/octo-online/robospice

उत्तर

9

@ टेक संभावनाएं चा बनाओ। आप जो कह रहे हैं वह बिल्कुल सही है। आरएस को इस व्यक्तित्व के साथ दिमाग में डिजाइन किया गया है: नेटवर्क अनुरोधों और गतिविधियों के जीवन चक्रों का प्रबंधन।

@ craigrs84। असल में, आरएस के साथ क्या होता है कि जब एक अनुरोध संसाधित किया जा रहा है, तब तक इसके श्रोताओं को लागू किया जाएगा जब तक कि संबंधित गतिविधि जीवित है। यदि गतिविधि अब ज़िंदा नहीं है, तो इसके सभी श्रोताओं को आरएस से अनप्लग किया गया है, और उन्हें अधिसूचित नहीं किया जाएगा।

आरएस का मुख्य उद्देश्य यह सुनिश्चित करना है कि कोई स्मृति रिसाव नहीं है: आपकी गतिविधि, अगर इसे मरना है, मर जाएगा और कचरा इकट्ठा किया जाएगा, आरएस को कचरा रोकने से कोई कठोर संदर्भ नहीं है संग्रह। RoboSpice के पीछे यह वास्तव में मूल विचार है।

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

ऐसे मामले में, मसाले के लिए कॉल के ठीक बाद, विधि spiceManager.addListenerIfPending विधि का उपयोग करें। यह एक नया अनुरोध निष्पादित नहीं करेगा, लेकिन लंबित अनुरोध पर एक नया श्रोता पुन: प्लग करें। अगर कोई अनुरोध लंबित नहीं है, तो यह कुछ भी नहीं करेगा।

+0

तो यदि आप एक अनुरोध CacheKey प्रदान नहीं करते हैं, और एक ही समय में चल रहे एक ही गतिविधि के कई उदाहरण हैं, तो क्याListenerIfPending अभी भी सही तरीके से काम करेगा? या उस मामले में पर्याप्त जानकारी नहीं है? यह शायद एक असंभव परिदृश्य है लेकिन मैं उत्सुक हूँ। – craigrs84

+0

@ स्किनोलस, मैं उत्सुक हूं, अगर आप कॉलस्टॉप() (या गैर-एसिंक विधि) को कॉल नहीं करते हैं, तो लाइब्रेरी उन गतिविधियों को वापस नहीं ले जाती है जो क्रियाकलापों, टुकड़ों, सेवाओं आदि में पंजीकृत हैं? स्रोत के माध्यम से बहुत अधिक खोदने के बिना और आपके प्रारंभिक उपयोग और आपकी लाइब्रेरी के परीक्षण के आधार पर, मुझे एक अपवाद मिलेगा जब मुझे "ऑब्जेक्ट" वाले ऑब्जेक्ट में कॉलबैक प्राप्त हुआ। इसके अलावा, पुस्तकालय बहुत अच्छा है, कृपया अच्छा काम जारी रखें! – AllDayAmazing

+0

यदि आप shouldStop को कॉल नहीं करते हैं, तो श्रोताओं को ट्रिगर किया जाएगा। यह क्रैश और मेमोरी लीक का कारण बन सकता है क्योंकि अक्सर श्रोताओं आंतरिक कक्षाएं होती हैं और एक गतिविधि उदाहरण पर एक संदर्भ धारण करती हैं जो नष्ट हो जाती थी, और अगर आप अपने श्रोताओं में खोजने के लिए चीजें देखते हैं तो यह भी दुर्घटनाग्रस्त हो सकता है। मुझे लगता है कि आपको यह मिल गया, बस चीजों को स्पष्ट करना चाहता था। – Snicolas

2

संक्षिप्त उत्तर है, मेरे अनुभव से, कि यह नहीं है है।

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

+0

क्षमा करें, लेकिन नहीं, श्रोताओं के साथ आरएस में कोई स्मृति रिसाव नहीं है। उन्हें हटा दिया जाता है और कचरे में कचरा इकट्ठा किया जाता है। – Snicolas

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