2011-09-19 7 views
8

मैं अपनी पहली Android एप्लिकेशन पर काम कर रहा हूँ सहेजा गया है। इसमें एक मॉडल है जो डेटाबेस के लिए जारी रहता है क्योंकि उपयोगकर्ता अपडेट करता है।onSaveInstanceState/onPause - जब तक प्रतीक्षा राज्य पूरी तरह से पहले की प्रक्रिया की इजाजत दी मारे जाने के लिए

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

अब, Android पर सूत्रण की # 1 नियम है, "यूआई धागा ब्लॉक नहीं है" तो निश्चित रूप से डीबी बातचीत एक अलग थ्रेड पर होता है। लेकिन एंड्रॉइड लाइफसाइक्ल की मेरी समझ यह है कि कई मामलों में SaveInstanceState को कॉल किया जा रहा है क्योंकि एंड्रॉइड सिस्टम प्रक्रिया को मारना चाहता है। इससे पता चलता है कि मैं इस विधि को वापस लौटने की अनुमति नहीं दे सकता जब तक कि डीबी थ्रेड दस्तावेज़ को सहेजने में समाप्त नहीं हो जाता (और वास्तव में मेरे वर्तमान डिज़ाइन के साथ, मुझे वास्तव में पता नहीं है कि दस्तावेज़ की आईडी संख्या तब तक डीबी में सहेजी गई है, इसलिए मैं इसे सहेजे गए राज्य के बंडल में भी नहीं डाल सकता)।

यह इन परिस्थितियों जारी रहती कार्य के लिए इंतजार कर रहे यूआई धागा ब्लॉक करने के लिए के तहत उचित किया जाना है? जब onSaveInstanceState कहा जाता है क्योंकि प्रक्रिया को मार दिया जा रहा है, तो ऐप अब अग्रभूमि में दिखाई नहीं दे रहा है, इसलिए उत्तरदायी बनने के लिए कोई इंटरफ़ेस नहीं है। जब गतिविधि उदाहरण एक config अद्यतन है, जो होता है जब स्क्रीन अभिविन्यास परिवर्तन वालों द्वारा नष्ट किया जा रहा है

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

वहाँ इन स्थितियों के लिए एक स्वीकृत अभ्यास है? क्या मुझे थ्रेड को सुरक्षित रखने के लिए अवरुद्ध करना चाहिए? क्या मैं ब्लॉक और प्रतीक्षा करने के लिए सामान्य जावा थ्रेड प्राइमेटिव का उपयोग कर सकता हूं? क्या ऐसा कुछ है जो मैं कर सकता हूं धागे को अवरुद्ध नहीं करता है, लेकिन यह सुनिश्चित करता है कि एंड्रॉइड प्रक्रिया को बंद करने से पहले लगातार कार्य समाप्त हो जाएगा?

यह सब पर भी लागू होता है, onSaveInstanceState के रूप में आवश्यक नहीं है।

उत्तर

0

आपको AsyncTask को आजमाया जाना चाहिए, जो आपकी यूई को अवरुद्ध करेगा लेकिन रिक्त स्क्रीन नहीं दिखाएगा, आवश्यक xml तत्व लोड करेगा और फिर Async कार्य से कॉल प्राप्त होगा, async कार्य में डेटाबेस में अपना दस्तावेज़ सहेजें। AyncTask Exmaple

+0

मैंने सोचा था कि 'AsyncTask' की बात यह थी कि यह * * यूआई धागा ब्लॉक नहीं करता? क्या यह लंबे समय तक चलने वाले संचालन करने के लिए इसका उपयोग करने का पूरा बिंदु नहीं है? – Ben

+0

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

+0

यही काम है (लेकिन अपने स्वयं समस्या नहीं है), लेकिन पूरी तरह से सवाल है, जो मैं लगातार डेटा सुनिश्चित करते हैं कि कैसे हमें वास्तव में बचाया जब एप्लिकेशन मार दिया जाता है, तो बचत एक पृष्ठभूमि द्वारा किया जाता है के लिए अप्रासंगिक है धागा। – Ben

2

आप onSaveInstanceState में लगातार बचत करने के लिए क्या करने की जरूरत नहीं है, तो आप काफी सिर्फ उदाहरण राज्य Bundle में सहेज सकते हैं ताकि उदाहरण जल्दी से हो सकता है onRestoreInstanceState में फिर से शुरू:

इस लिंक का पालन करें।

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

मुझे लगता है कि मेरी सिफारिश यहां दस्तावेज़ पाठ को सहेजना होगा और onSaveInstanceState में बंडल में जो कुछ भी होगा उसे onRestoreInstanceState में पुनर्स्थापित करें। का प्रयोग करें एक "बैकअप प्रतिलिपि" कहीं तेजी से (अस्थायी फ़ाइल शायद?) जो तब onResume में बहाल किया जा सकता है अगर यह डेटाबेस के लिए सहेजा नहीं गया है को बचाने के लिए। और डेटाबेस को डेटा को वास्तव में सहेजने के लिए onStop (जिसे गतिविधि पहले से ही पृष्ठभूमि में है) का उपयोग करें।

ध्यान दें कि गतिविधि के बाद हत्या कर दी हो सकता है कहा जाता है किया गया है (पहले कभी नहीं, जब तक कि प्रणाली बहुत बहुत कुछ छोड़ दिया है ... संसाधन उपलब्ध हैं), यही कारण है कि मैं डेटाबेस में यह प्रतिबद्ध करने के लिए प्रयास करने से पहले एक त्वरित बैकअप की बचत होगी है ।

संपादित करें - अतिरिक्त टिप्पणियां

के आधार पर सुनिश्चित करें कि पृष्ठभूमि धागा कि बचत प्रक्रिया कर रहा है से पहले आवेदन प्रणाली द्वारा मारा जा सकता है बचत से किया जाता है बनाने के लिए, मुझे लगता है कि यह ब्लॉक और प्रतीक्षा करने के लिए ठीक है बचत धागा से लौटने से पहले पूरा करने के लिए, लेकिन मैं android:configChanges="orientation" का उपयोग करना चाहिये गतिविधि पुनः आरंभ (और कॉल) जब उन्मुखीकरण परिवर्तन रोकने के लिए।

+0

मैं वास्तव में डेटाबेस के रूप में सब कुछ लिखित के रूप में जल्द ही प्रतिबद्ध करता हूं। मैं इसे 'ऑनवेस्टेंसस्टेट' में नहीं करता हूं। समस्या यह है कि अंतिम ट्रिगर सहेजने का ऑपरेशन * अभी भी चालू हो सकता है * जब 'ऑनसेवस्टेंसस्टेट' कहा जाता है। मुझे यह जानने की जरूरत है कि एंड्रॉइड सिस्टम को बताने के लिए कैसे इंतजार करना है "लगातार मुझे मारना ठीक है" जब तक कि लगातार डेटा वास्तव में सुरक्षित न हो। यदि सिस्टम संसाधनों पर इतना कम है कि यह मेरी प्रक्रिया को मनमाने ढंग से मारता है, तो अप्रत्याशित संपादन खोना ठीक है, लेकिन मैं नहीं चाहता कि प्रक्रिया सामान्य परिचालन स्थितियों के तहत डीबी ऑपरेशन के माध्यम से आधे रास्ते में मारे जाए। – Ben

+0

उस स्थिति में आप mak_just4anything द्वारा सुझाए गए अनुसार अपनी मेनिफेस्ट फ़ाइल में एंड्रॉइड: configChanges = "ओरिएंटेशन" का उपयोग कर 'ऑनसेवस्टेंसस्टेट' को छोड़ सकते हैं। बस सुनिश्चित करें कि बचत 'रोकें'/'ऑनटॉप 'में की जाती है। यहां अधिक जानकारी: http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange – Zharf

+0

मैं स्पष्ट रूप से अपना प्रश्न समझ नहीं रहा हूं। आइए कहें कि 'ऑन पॉज़' कॉल 'टेलबैकग्राउंड थ्रेड टू सॉवस्टेट टीओडीबी' कहें। अच्छा। किया हुआ। अब, मैं यह सुनिश्चित कैसे करूं कि पृष्ठभूमि थ्रेड अभी भी उस अनुरोध को संसाधित नहीं कर रहा है जब एंड्रॉइड मेरी प्रक्रिया को मारना चाहता है? – Ben

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

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