2013-10-09 9 views
5

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

i) जबकि हमारा ऐप पृष्ठभूमि में है, हमने कुछ उच्च अंत गेम खेले हैं। अब हम कम से कम स्क्रीन (हालिया ऐप्स) के माध्यम से ऐप पर वापस गए। अचानक ऐप दुर्घटनाग्रस्त हो गया।
ii) अगर हम सेटिंग के माध्यम से ऐप को रोकते हैं, और कम से कम स्क्रीन के माध्यम से ऐप पर वापस आते हैं तो वही दुर्घटना होती है।
ऑब्जेक्ट शून्य हो जाता है

दोनों मामले, ऑब्जेक्ट ए शून्य हो जाता है (इसे जीसी द्वारा हटाया जा सकता है), इसलिए ऑब्जेक्ट ए पर निर्भर सभी ऑपरेशन अपवाद प्राप्त कर रहे हैं।

ऐसा क्यों हो रहा है? हम जीसी को वस्तु ए एकत्र करने से कैसे रोक सकते हैं? हम बल स्टॉप से ​​कैसे निपट सकते हैं? कृपया कोई विचार दें।

+0

आप जीसी या सिस्टम को अपनी प्रक्रिया को मारने से मजबूर नहीं कर सकते हैं। आपको ऐसे मामलों में अपनी वस्तु को क्रमबद्ध/deserialize करने का एक तरीका खोजना चाहिए। –

+0

एंड्रॉइड ऐप्स लिखते समय आपको सबसे महत्वपूर्ण अवधारणा समझनी चाहिए। http://developer.android.com/training/basics/activity-lifecycle/index.html – Kuffs

+0

एंड्रॉइड (वास्तव में, डाल्विक) जीसी व्यक्तिगत ऑब्जेक्ट्स नहीं करता है जब तक कि आपका ऐप नहीं चल रहा हो और इसमें कोई संदर्भ न हो। मुझे नहीं पता कि यह मिथक कहाँ शुरू हुआ। आपका ** ऐप ** मारे जा सकता है, इस मामले में यह सब खरोंच से शुरू होता है। यदि आपको राज्य को सहेजने की आवश्यकता है, तो 'ऑन पॉज़()' और/या 'ऑनस्टॉप() 'का उपयोग करके क्रमबद्ध करें। नोट, 'onDestroy()' केवल तभी उपयोगी होता है जब आप एक गतिविधि समाप्त करें() '। बीटीडब्ल्यू, यदि वह 'संदर्भ' जिसे आप संग्रहीत कर रहे हैं वह 'गतिविधि' संदर्भ है, तो आप इसे सब गलत कर रहे हैं। – Simon

उत्तर

7

ऐसा क्यों हो रहा है?

अन्य ऐप्स को भी चलाने के लिए स्मृति की आवश्यकता है। यह मानना ​​अनुचित है कि एंड्रॉइड आपके डेटा को अनिश्चित काल तक स्मृति में रखेगा।

हम जीसी को ऑब्जेक्ट ए एकत्र करने से कैसे रोक सकते हैं?

मत करो। अपनी समस्या का एक अलग समाधान खोजें।

हम बल स्टॉप से ​​कैसे निपट सकते हैं? कृपया कोई विचार दें।

अंत में, निर्णय आप पर निर्भर है, लेकिन यहाँ कुछ आम विकल्प हैं:

  • जब संग्रहीत डेटा अब मौजूद नहीं है, एप्लिकेशन के एक ताजा प्रक्षेपण के रूप में इस का इलाज। उपयोगकर्ता को लैंडिंग पृष्ठ पर लाएं और उसे एक नया गेम शुरू करें।
  • डेटा पर बने रहें। आपके स्टोर को संग्रहीत करने के आधार पर, साझा किए गए संदर्भ या SQLite अच्छे विकल्प हो सकते हैं। अपने भंडारण विकल्पों के सारांश के लिए Storage Options देखें।

दूसरा विकल्प स्पष्ट रूप से आपके संदर्भ के लिए काम नहीं करेगा, लेकिन शायद मैं संदर्भ के लिए एक अलग समाधान आर्किटेक्ट करूँगा।

2

आप इसके लिए आवेदन संदर्भ का बेहतर उपयोग करते हैं! बस अपने Activity में getApplicationContext() का उपयोग करें और इसके बजाय इसका उपयोग करें। अन्यथा सिस्टम को स्मृति की आवश्यकता होने पर आपकी गतिविधि लीक हो जाती है।

घर दबाते समय आपकी गतिविधि पृष्ठभूमि में हो जाती है, जब वीडियो गेम या मेमोरी उपभोग करने वाले ऐप्स चलाते हैं, तो आपकी गतिविधि सिस्टम द्वारा मुक्त हो जाती है।इस को हल करने के

गतिविधि जीवनचक्र को समझने की कोशिश:

enter image description here

इसके अलावा जब यह "सामान्य" जावा गतिविधि के लिए अपनी लिपटा वस्तु इसके लिए अपने eligable रूप GC द्वारा एकत्र हो जाता है जैसे ही में देख , यानी यह अब किसी अन्य वस्तु द्वारा संदर्भित नहीं है। सिस्टम को स्मृति की आवश्यकता होने पर आपका पूरा ऐप मुक्त हो जाने पर इसे रोका नहीं जा सकता है। onResume() में शून्य के लिए जांचने का प्रयास करें और फिर अपने ऑब्जेक्ट को फिर से चालू करें!

मुझे आशा है कि यह आपकी मदद कर सकता है।

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