2013-08-07 4 views
15

तरह:एंड्रॉइड में एक नई गतिविधि शुरू करने के बाद फिनिश() को कॉल करना अच्छा विचार है?

startActivity(intent); 
finish(); 

finish() explicitly, onDestroy() बुला बिना पूर्व गतिविधि के लिए नहीं बुलाया जाता है, और मैं (OutOfMemory Exception).

तो स्मृति से बाहर चलाने, यह एक अच्छा विचार finish() explicitly to prevent OutOfMemory Exception?

+0

क्या होगा यदि उपयोगकर्ता वापस बटन पर क्लिक करके पिछली गतिविधि पर वापस जाना चाहता है? – Raghunandan

+2

नहीं। आपकी समस्या कहीं और है। – fdreger

+0

क्या आप कहीं भी 'बिटमैप' (या संग्रह) का उपयोग कर रहे हैं? यदि आपने अभी तक [मैट मेमोरी विश्लेषक उपकरण] (http://www.eclipse.org/mat/) का उपयोग नहीं किया है, तो अब एक अच्छा समय है। – haventchecked

उत्तर

1

ऐसा है कॉल करने के लिए है ठीक है अगर आपको उस Activity के उदाहरण की आवश्यकता नहीं है। तो जब आप अगले Activity पर वापस दबाएंगे तो पता चलेगा कि आप इस पर वापस नहीं आ जाएंगे, लेकिन नीचे दिए गए स्टैक पर जो कुछ भी है, वह Activity था या नहीं, यदि होम नंबर नहीं है।

हालांकि, मुझे यकीन नहीं है कि आपको OOM अपवाद क्यों मिल रहा है और आपको शायद यह पता लगाना चाहिए कि वह कहां से आ रहा है। यदि आप Bitmap एस का उपयोग कर रहे हैं तो यह अपवाद पैदा कर सकता है।

+0

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

0

finish()startActivity के बाद एंड्रॉइड दिशानिर्देशों का पालन नहीं करता है। आपके OutOfMemoryExecption किसी और चीज के कारण

+13

दिशानिर्देशों में यह कहता है कि आपको 'प्रारंभिकता' को कॉल करने के बाद 'फिनिश()' को कॉल नहीं करना चाहिए? –

+2

ऐसा प्रतीत होता है कि मैंने नीचे आपकी टिप्पणी पढ़ने के बाद दिशानिर्देश का गलत व्याख्या किया। मेरी गलती। –

25

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

नई गतिविधि शुरू करने के बाद finish() पर कॉल करना बिल्कुल ठीक है। नतीजा यह होगा कि वर्तमान गतिविधि (जो अब स्टैक के शीर्ष पर नहीं है, क्योंकि आपने अभी एक नया शुरू किया है) को स्टैक से निकाल दिया जाएगा। फिर जब उपयोगकर्ता वापस दबाता है, तो यह पिछली गतिविधि पर बैक स्टैक पर जाएगा (या स्टैक खाली होने पर आपके ऐप से बाहर निकलें)।

यदि आप हमेशा एक नया शुरू करके और finish() पर कॉल करके कभी भी आगे बढ़ रहे हैं, तो यह ओओएम अपवाद का कारण बन सकता है क्योंकि स्टैक प्रत्येक गतिविधि के उदाहरणों के साथ भर जाता है।

आप गाइड विषय Tasks and Back Stack में इसके बारे में और अधिक पढ़ सकते हैं। यह भी वर्णन करता है कि गतिविधियों के बीच साइकिल चलाने के साथ सही ढंग से कैसे निपटें।

+0

ग्रेट उत्तर। धन्यवाद। – stevehs17

+0

'प्रारंभिकता (इरादा) का क्रम; खत्म(); 'ये दो बयान बिल्कुल मायने रखते हैं? –

+1

@WeishiZeng - मैंने इसे दोनों तरीकों से किया है और ऐसा कोई फर्क नहीं पड़ता है। मुझे नहीं लगता कि यह मायने रखता है। –

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

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