2012-03-02 13 views
5

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

यहां तक ​​कि टुकड़े और लोडर प्रबंधक के साथ, यह अभी भी मेरे लिए एक समस्या प्रतीत होता है।

मनमाने ढंग से लंबे समय तक चलने वाले कार्यों और अभिविन्यास परिवर्तनों को प्रबंधित करने के लिए इन दिनों पसंदीदा तरीका क्या है? यह जानने के लिए कि नव निर्मित गतिविधि में कौन से कार्य चल रहे हैं। यह सुनिश्चित करने के लिए कि जब कोई गतिविधि संलग्न नहीं होती है तो कोई कार्य इसकी जानकारी वितरित करने का प्रयास नहीं करता है।

आप

+2

मेरा सुझाव है कि आप उन स्थानों पर "प्रक्रिया" शब्द को प्रतिस्थापित करते हुए अपने प्रश्न को फिर से लिखते हैं, जहां आप वास्तव में "प्रक्रिया" का मतलब नहीं रखते हैं बल्कि इसके बजाय कुछ और मतलब है। एक ओएस प्रक्रिया में एक बहुत ही विशिष्ट परिभाषा होती है, जो आपके प्रश्न को थोड़ा समझने का कारण बनती है (उदाहरण के लिए, प्रक्रियाएं जानकारी प्रदान नहीं करती हैं, गतिविधियां प्रक्रियाएं नहीं बनाती हैं)। – CommonsWare

उत्तर

4

मेरे कार्यक्रम में मैं सिर्फ प्रकट में मेरी गतिविधियों में

android:configChanges="orientation|keyboardHidden|keyboard" 

डाल दिया और इसके साथ किया जाए। 1 साल बाद मुझे 0 समस्याएं थीं।

+0

कॉन्फ़िगरेशन को संभालने के बारे में आप कैसे जाते हैं? – synic

+0

मैंने पाया है कि मैनिफेस्ट में होने से गतिविधि को फिर से नहीं बनाया जा सकता है, इस प्रकार आपकी सभी समस्याओं को हल किया जा सकता है। मैं इसे खुद संभालने में लग रहा था, लेकिन इसे अभ्यास में अनावश्यक पाया। यह काम करता है कि आप कैसे उम्मीद करेंगे/चाहते हैं। – Pyrodante

+0

वाह। मैं हमेशा इस से दूर भाग गया क्योंकि यह चाहता था कि यह अधिक जटिल लग रहा था। आप सही हैं, ऐसा लगता है कि मैं इसे कैसे करना चाहता हूं। – synic

-1

इसका एक ही धन्यवाद के रूप में यह हमेशा किया गया है: एक सेवा का उपयोग करें। अपनी सेवा से प्रसारण कार्यक्रम और उन्हें अपनी गतिविधि (या कुछ मध्यवर्ती परत) में पकड़ें। आपकी गतिविधि तब चुन सकती है कि उसके राज्य के आधार पर उन घटनाओं के साथ क्या करना है।

यह एक बड़ा सवाल है।

+1

मुझे नहीं लगता कि यह समस्या है कि सेवाओं को हल करने के लिए हैं। ऐसा लगता है कि यदि आपके आवेदन में आपके गतिविधि जीवन चक्र से स्वतंत्र नहीं हैं, तो सेवा केवल संसाधनों का अपशिष्ट होगा। – synic

0

जैसा कि अन्य पोस्ट से पता चलता है, आप एंड्रॉइड: configChanges = xxx का उपयोग कर सकते हैं।

लेकिन, यह हमेशा वांछित नहीं है। एंड्रॉइड को कॉन्फ़िगरेशन परिवर्तन पर गतिविधि को मारने के लिए डिज़ाइन किया गया है, और नया निर्माण किया गया है, और वैकल्पिक स्क्रीन लेआउट प्रदान करके आप कुछ स्थितियों से इसका लाभ उठा सकते हैं। यह उदाहरण के लिए बहु-फलक ऐप में समझ में आता है, जहां परिदृश्य अभिविन्यास पोर्ट्रेट अभिविन्यास से अलग दृश्य दिखाता है।

तो अपने प्रश्न पर लौटने के लिए: मैं लंबे समय से चल रहा आपरेशन को संभालने के लिए पसंदीदा तरीका के बारे में पढ़ा नहीं था, लेकिन स्वयं के अनुभवों से मैं लगातार गतिविधि राज्य में इस तरह के काम के लिए स्टोर करने के लिए सुझाव देंगे (बचाया/onRetainNonConfigurationInstance/onCreate में बहाल) , या लगातार टुकड़ों का उपयोग कर।

यदि आपकी गतिविधि का पता चलता है कि कुछ कार्य पहले से चल रहा है, तो यह इसकी प्रगति दिखाने के लिए संवाद को फिर से बनाने का मौका दे सकता है।

और ध्यान दें: ओरियन परिवर्तन केवल यही नहीं है जो आपकी गतिविधि को फिर से बनाया जा सके। भाषा परिवर्तन, डॉकिंग और अन्य संभावनाओं के लिए तैयार रहें :) लेकिन फिर भी, अभिविन्यास परिवर्तन सबसे आम है।

+0

लगातार फ्रैगमेंट्स में गतिविधि को संलग्न होने पर परिणाम देने की कोशिश करने की संभावना है। onRetainNonConfigurationInstance एक सक्रिय नेटवर्क कनेक्शन स्टोर, कह नहीं सकता है। यहां समस्या कॉन्फ़िगरेशन परिवर्तन के लिए स्थिति संग्रहीत नहीं कर रही है, यह सुनिश्चित कर रहा है कि जब कोई गतिविधि संलग्न नहीं होती है, तो डेटा वितरित नहीं होता है, या यह सुनिश्चित कर रहा है कि यह किसी मृत गतिविधि को वितरित करने का प्रयास नहीं करता है – synic

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