2012-12-19 10 views
8

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

लेकिन, to documentation aсcording मैं चाहिए do not count on this method being called as a place for saving data.

वहाँ अपने डेटा को बचाने के लिए किसी भी वैकल्पिक जगह है?

उत्तर

17

OnDestroy हमेशा कॉल नहीं किया जा रहा है। जीवन चक्र डॉक्स से -

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

हालांकि onPause() विधि onStop() से पहले कहा जाता है, आप का उपयोग करना चाहिए onStop() बड़े, अधिक सीपीयू गहन बन्द करते इस तरह के एक डेटाबेस

को जानकारी लेखन के रूप में संचालन, प्रदर्शन करने के लिए देखें Stop Your Activity

+0

तो वैकल्पिक क्या है? .. –

+0

अपने डेटा को 'ऑनस्टॉप()' में सहेजें। इसे हमेशा बुलाया जाएगा। – iagreen

+0

ऑनसेट कॉल ऑनलाइन से पहले कॉन्फ़िगरेशन इंस्टेंस, इसलिए मुझे नहीं पता कि यह परिष्करण गतिविधि है, या सिर्फ उन्मुखीकरण परिवर्तन है। –

3

आप का उपयोग किया जाना चाहिए onStop

Activity docs

तुम भी इस्तेमाल कर सकते हैं, लेकिन जब भी आप Activity से दूर नेविगेट कि बुलाया जाएगा स्क्रीन बंद करने के भी शामिल है।

+0

ऑनस्टॉप कॉल ऑनलाइन से पहले कॉन्फ़िगरेशन इंस्टेंस, इसलिए मुझे नहीं पता कि यह परिष्करण गतिविधि है, या केवल उन्मुखीकरण परिवर्तन है। –

+1

मैं पूरी तरह से समझ नहीं पा रहा हूं कि गतिविधि चलाने के दौरान आप डेटाबेस को क्यों नहीं लिखते हैं ... आप इसे एक अलग थ्रेड में कर सकते हैं और यह सुनिश्चित करने के लिए लोडर एपीआई का उपयोग कर सकते हैं कि यह सब सिंक हो ... ऐसा लगता है मेरे लिए एक बेहतर डिजाइन पैटर्न। अपने रास्ते के साथ, आप हमेशा लोगों को अपने फोन या ओएस को आक्रामक रूप से स्मृति को पुनः प्राप्त करने का जोखिम उठाने वाले लोगों को जोखिम देते हैं, या कौन जानता है कि और क्या है। –

+0

मैं एक्शन लॉगिंग का उपयोग करता हूं, इसलिए सुस्त ऐप टर्मिनेशन कोई समस्या नहीं है। गतिविधि चलने के दौरान, मैं समय-समय पर कुछ टाइमर और स्टोर डेटा का उपयोग करूंगा। –

4

आपको डेटा बचाने के लिए onDestroy() विधि का उपयोग नहीं करना चाहिए। इसके बजाय, आपको आंतरिक/बाहरी संग्रहण स्थान का उपयोग करना चाहिए या onPause() विधि में अपना कोड लिखना चाहिए।

+1

ऑन पॉज़ को बहुत ऑफटेन कहा जा सकता है, और बचत प्रक्रिया निष्कासित है। –

2

Activity Lifecycle documentation के अनुसार आपको onPause() या onSaveInstanceState(Bundle) में अपना डेटा सहेजना चाहिए।

विधियों onDestroy() और onStop() गतिविधि बंद होने से पहले कभी नहीं कहा जा सकता है।

अंशः Activity Lifecycle documentation से:

संरक्षित शून्य OnDestroy()

नोट: इस पद्धति पर गिनती नहीं है डेटा को बचाने के लिए एक जगह के रूप में कहा जा रहा है!उदाहरण के लिए, किसी गतिविधि को सामग्री प्रदाता में डेटा संपादन कर रहे हों, उन संपादन या तोonPause()या onSaveInstanceState(Bundle), यहाँ नहीं में प्रतिबद्ध होना चाहिए।

संरक्षित शून्य onStop()

ध्यान दें कि यह विधि कम स्मृति स्थितियों में, कभी नहीं कहा जा सकता है जहां प्रणाली पर्याप्त स्मृति नहीं है अपनी गतिविधि की प्रक्रिया अपने onPause के बाद चालू रखने के लिए() विधि कहा जाता है।

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