2010-10-10 10 views
27

मुझे अपने एंड्रॉइड ऐप को इसकी स्थिति को डिस्क पर सहेजने के लिए चाहिए जब इसकी गतिविधि पृष्ठभूमि में रखी जाए या मार डाला जाए। यह सुझाव दिया गया है कि जब मैं ऑन पॉज़() को कॉल करता हूं और वहां कोई महंगी I/O प्रक्रियाएं करता हूं (Saving/loading document state quickly and robustly for image editor देखें)।एंड्रॉइड छोड़ते समय एंड्रॉइड पृष्ठभूमि थ्रेड कैसे संभालता है?

ओएस किस स्थिति में ओएस को थ्रेड मार देगा और ये स्थितियां आमतौर पर कैसे होती हैं?

मुझे लगता है कि यह कैसे क्रियाएँ साथ जहां ओएस धागा को मारने के लिए तय मनमाने ढंग से कर सकते हैं लेकिन ज्यादातर केवल यह कर देगा जब संसाधनों अत्यंत सीमित हैं बांटे जाने से तरह होगा। हालांकि इस के कुछ विशिष्ट दस्तावेज ढूंढना अच्छा लगेगा।

कुछ टेस्ट कोड के साथ खेलने के बाद, कुछ डिवाइस पर पृष्ठभूमि थ्रेड शुरू हो गया है() मेरे डिवाइस पर पृष्ठभूमि में अनिश्चित काल तक चलाएगा (मैंने कई ऐप्स लोड करने का प्रयास किया और इसे मारने के लिए नहीं मिला)।

मेरी विशिष्ट एप्लिकेशन के लिए, मैं एक बिटमैप संपादक जहाँ मैं कमान पैटर्न और मेमेंटो पैटर्न का उपयोग कर रहा पूर्ववत की अनुमति है और संपादन के फिर से करना लिख ​​रहा हूँ। मैं चाहता हूं कि उपयोगकर्ता अपने संपादन को पूर्ववत/दोबारा करने में सक्षम हो। उपयोगकर्ता को फोन कॉल मिलता है और जब पृष्ठभूमि में रखा जाता है तो गतिविधि मारे जाती है। सबसे अच्छा समाधान मैं सोच सकता हूं कि बैकग्राउंड थ्रेड का उपयोग अनुप्रयोग के उपयोग के दौरान डिस्क पर मेरे कमांड और मेमेंटो ऑब्जेक्ट्स को लगातार सहेजने के लिए और पॉज़ थ्रेड में छोड़े गए किसी भी ऑब्जेक्ट को सहेजने के लिए है। बदतर मामले में, अगर धागा मारे गए तो मैं केवल कुछ संपादन खो दूंगा।

उत्तर

21

ओएस किस स्थिति में ओएस को थ्रेड मार देगा और ये स्थितियां आमतौर पर कैसे होती हैं?

ओएस थ्रेड को मार नहीं देगा, जब तक कि यह प्रक्रिया को मार नहीं रहा है - एंड्रॉइड आपके द्वारा बनाए गए धागे के साथ कुछ भी नहीं करता है। यदि आप अग्रभूमि प्रक्रिया हैं, तो आप को नहीं मारा जाएगा। एंड्रॉइड की बाधाएं अग्रभूमि खोने के कुछ सेकंड के भीतर प्रक्रिया को मार रही हैं (onPause() के बाद) miniscule हैं। प्रक्रिया जीवनकाल पर प्रलेखन - इसमें क्या है - here पाया जा सकता है।

+1

बस स्पष्ट करने के लिए, यदि आप कुछ गतिविधि से जुड़ी प्रक्रिया में धागा बनाते हैं, तो गतिविधि को मारने पर यह धागा मारा जाएगा (यानी प्रक्रिया और धागा जुड़े हुए हैं)? – memcom

+2

@tifftuff: एक गतिविधि एक आवेदन नहीं है। एक गतिविधि एक आवेदन का एक घटक है। एक आवेदन में कई गतिविधियां हो सकती हैं, जिनमें कई गतिविधियां, सेवाएं इत्यादि शामिल हैं। जब किसी एप्लिकेशन का अंतिम घटक नष्ट हो जाता है (उदाहरण के लिए, उपयोगकर्ता एक छोटे से एप्लिकेशन में एकमात्र गतिविधि से वापस दबाता है), प्रक्रिया रीसाइक्लिंग के लिए निर्धारित की जाती है या समाप्ति। थ्रैड मत लीजिए। यदि आप धागा शुरू करते हैं, तो आपको इसे समाप्त करने की व्यवस्था करनी होगी, क्योंकि एंड्रॉइड इसे आपके लिए समाप्त नहीं करेगा, प्रक्रिया को समाप्त करने के अलावा, जो कुछ हफ्तों तक नहीं हो सकता है। – CommonsWare

+0

धन्यवाद। क्या आपके पास इस पृष्ठभूमि के काम के लिए धागे की तुलना में उपयोग करने के लिए कोई और सेवा उचित होगी या नहीं? – memcom

1

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

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

मुझे लगता है कि आपका दृष्टिकोण उचित है - बचत डेटा को लगातार अद्यतन करने के लिए कम प्राथमिकता वाले थ्रेड का उपयोग करें, और इसे सामान्य प्राथमिकता दें, और इसे ध्वज सेट करें क्योंकि यह इसे समाप्त होने के बाद समाप्त करने के लिए कहता है।

जाहिर है, आपको यह सुनिश्चित करने की आवश्यकता होगी कि अगर आप ऑन-ऑन के बाद तुरंत पुनः प्राप्त करते हैं तो आप सिंक्रनाइज़ेशन समस्याओं में भाग नहीं लेते हैं (यानी थ्रेड अभी भी व्यस्त है)।

5

गतिविधि के नष्ट होने के बाद किसी भी समय आपका धागा मारा जा सकता है, या इसे कभी नहीं मारा जा सकता है। इस तरह के धागे के आधार पर बहुत खराब रूप है - आप आधे पूर्ण ऑपरेशन के साथ समाप्त हो सकते हैं, या एक थ्रेड के साथ जो हमेशा के लिए चिपक जाता है।

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

ईमानदारी से, सही उत्तर यह सुनिश्चित करना है कि कभी भी कोई अस्थायी प्रक्रिया स्थिति न हो जिसे सहेजने में लंबा समय लगेगा। यदि आपको कुछ उपयोगकर्ता परिवर्तनों को प्रतिबिंबित करने के लिए एक बड़ी फ़ाइल लिखनी है, तो "लेन-देन लॉग" बनाए रखने पर विचार करें जिसका उपयोग आप पुनरारंभ करने योग्य सहेजने के लिए कर सकते हैं। यह देखते हुए, आप सुरक्षित रूप से अपनी सेवा को एक सेवा में चला सकते हैं और जानते हैं कि भले ही यह मारे जाए, संसाधनों के उपलब्ध होने पर यह स्वचालित रूप से पुनरारंभ हो जाएगा।

+0

थ्रेड लगभग 5 सेकंड के भीतर समाप्त हो जाएगा क्योंकि मैं यह पुष्टि करने के लिए प्रतीक्षा करता हूं कि डिस्क पर मेरे डेटा को लिखा गया था (लगभग 2 एमबी लायक)। मेरा ऑटोसॉव लोडर इस बात को ध्यान में रखेगा कि थ्रेड को खत्म करने से पहले मारा जा सकता है और उपयोगकर्ता 30 सेकंड का काम खो सकता है। क्या आपको नहीं लगता कि इसके लिए एक सेवा शुरू करना थोड़ा भारी वजन है? मैं संपादन कार्यों का एक लेनदेन लॉग बना सकता हूं लेकिन इन्हें बाहर निकलने पर डिस्क पर सहेजने की आवश्यकता है (जहां मैं इसे तुरंत स्टोर कर सकता हूं?) और उपयोगकर्ता एक बड़ा संपादन कर सकता है और फिर बाधित हो सकता है। – memcom

+1

एक नई सेवा शुरू करना बिल्कुल * नहीं * बहुत हेवीवेट है। यह चीजों को करने का अनुशंसित तरीका है, उदाहरण के लिए, यदि एक सेकंड से अधिक समय लेना है तो विजेट अधिसूचना को संसाधित करना। सेवाएं * बिल्कुल * प्रदान करती हैं जो आप खोज रहे हैं - सिस्टम को एहसास होगा कि उनके पास घूमने का एक अच्छा कारण है और उन्हें पहले से ही मारने से बचने की कोशिश करेंगे, ताकि आप अधिक आत्मविश्वास से हो सकें कि आपको अपना 5 पृष्ठभूमि प्रसंस्करण के सेकंड। ऐसा लगता है कि आप दुर्लभ मामले के लिए पहले ही अच्छी तरह से सेट हैं जहां सेवा को मारने की जरूरत है, इसलिए आपको बस इतना ही चाहिए। – beekeeper

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