2011-06-01 13 views
15

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

क्योंकि इस सूत्र डेटाबेस में महत्वपूर्ण डेटा को संशोधित करता है मैं पूछ रहा हूँ, और अगर यह अचानक मौत हो जाती है, आवेदन ठीक से काम करना बंद कर सकता है।

उत्तर

13

AFAIK, यह प्रतीत होता है कि इस सूत्र पर अमल जारी है।

यह सच है लेकिन आपको इस बात की कोई गारंटी नहीं है कि धागा कब तक जीवित रहेगा।

क्या इस सूत्र का क्या होगा अगर एंड्रॉयड एक कम स्मृति स्थिति में हो जाता है और पूरे आवेदन को मारने का फैसला करता है?

यह वास्तव में मेरे अनुभव में एक दुर्लभ मामला है लेकिन यह डिवाइस की उपलब्ध स्मृति और उपयोगकर्ता के व्यवहार पर निर्भर करेगा, उदाहरण के लिए वे डिवाइस का भारी उपयोग करते हैं और कई ऐप्स शुरू करते हैं।

क्या कोई स्थिति कभी भी स्थिति में मर सकती है?

हाँ

यदि हां, तो वहाँ किसी भी तरह से मैं नहीं देख सकता कि धागा को मार डाला जा रहा है, और इसके बारे में कुछ करना है?

नहीं

क्योंकि इस सूत्र डेटाबेस में महत्वपूर्ण डेटा को संशोधित करता है मैं पूछ रहा हूँ, और अगर यह अचानक मौत हो जाती है, आवेदन ठीक से काम करना बंद कर सकता है।

जो आप वर्णन करते हैं उसे 'मिशन महत्वपूर्ण' के रूप में वर्गीकृत किया जा सकता है। जैसा कि अन्य दो उत्तरों ने इंगित किया है, एक सेवा चीजों को करने का एक और अधिक मजबूत तरीका होगा क्योंकि सेवा कम स्मृति स्थिति में 'मारे गए' की आखिरी चीजों में से एक है। START_REDELIVER_INTENT का उपयोग करके वह जो भी कर रहा था उसे फिर से शुरू करने में मदद कर सकता है।

किसी भी मामले में, यदि आप एक 'महत्वपूर्ण मिशन' आपरेशन है, तो आप इस तरह के लेन-देन के उपयोग और त्रुटि के मामले में पुनरावर्तन की संभावना के रूप में पूरी वसूली के लिए अपने कोड डिजाइन करने के लिए की जरूरत है।

+0

निश्चित रूप से, आप इसके बारे में कुछ कर सकते हैं। लेकिन एक बार जब आप ऐप को नष्ट नहीं कर देते हैं - 'ऑनस्ट्रोय' की तुलना में जल्द से जल्द कार्य करें - 'ऑनस्टॉप' में एक झंडा सेट करें जो धागा मतदान कर सकता है, यह जानने के लिए कि ऐप का खतरा दूर है। 'रेज़्यूम' में उस ध्वज को साफ़ करें। थ्रेड जितना संभव हो उतना छोटा काम करता है, और यदि यह ध्वज देखता है, तो यह स्वयं समाप्त होता है। प्रत्येक खंड के अंत में, यह फ़ाइल में इसकी प्रगति की स्थिति अपडेट करता है, इसलिए सही ढंग से पुनरारंभ कर सकते हैं। 'ऑनस्टॉप' में, '! Thread.isAlive' या 1 सेकंड तक वापस न आएं - परीक्षण और काउंटर के साथ लूप और एक समय में 100 एमएस सोएं, 10 गुना से अधिक नहीं। – ToolmakerSteve

+0

थ्रेड को किसी भी लंबी देरी (उदाहरण के लिए सर्वर से प्रतिक्रिया) के बाद ध्वज की जांच करने की आवश्यकता है, और महत्वपूर्ण कार्रवाइयां करने से पहले (स्थानीय फाइल/डेटाबेस अपडेट करना)। यह उस ध्वज सेट के साथ एक महत्वपूर्ण खंड कभी शुरू नहीं करता है। जब तक कि महत्वपूर्ण वर्ग 100-200 मीटर से अधिक नहीं हैं, मुझे लगता है कि आप अभ्यास में सुरक्षित हैं। (यह दावा नहीं करना मिशन मिशन महत्वपूर्ण ऐप के लिए अच्छा दृष्टिकोण है, लेकिन हम में से अधिकांश के लिए काफी अच्छा है।) ध्यान दें कि मेरे दृष्टिकोण का सार काम करना है * जबकि आपका ऐप अभी भी जिंदा है * - 1 तक 'स्टॉप' में देरी करके दूसरा। कई स्थितियों के लिए, यह सब कुछ जरूरी है। – ToolmakerSteve

+0

अद्यतन: 1 सेकंड तक देरी का मेरा सुझाव 'ऑनस्टॉप' के लिए उचित होने का लंबा तरीका है। शोध करने की आवश्यकता है कि कितना समय उचित है - उचित समय की एंड्रॉइड की परिभाषा क्या है। ध्यान दें कि यदि कोई यूआई कॉल है जहां एंड्रॉइड * कुछ हद तक उदार होना चाहिए, तो यह 'ऑनस्टॉप' है, क्योंकि यह सुनिश्चित करने के लिए एक ऐप का आखिरी मौका है कि उन्होंने जो भी देखभाल की है उसे संरक्षित किया है। – ToolmakerSteve

5

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

4

आप एक सेवा का उपयोग किया जाना चाहिए: एक प्रक्रिया एक सेवा चल रही क्योंकि

है रैंक पृष्ठभूमि गतिविधियों, एक गतिविधि शुरू की है कि एक लंबे समय से चल आपरेशन करने के लिए अच्छी तरह से कर सकते हैं के साथ एक प्रक्रिया की तुलना में अधिक कि ऑपरेशन के लिए एक सेवा शुरू करते हैं, बल्कि से बस एक कार्यकर्ता बनाने धागे की विशेष रूप से अगर आपरेशन गतिविधि खत्म होने की संभावना होगी।

यहां एक नज़र डालें: (पाठ जहां मैं जन्म चिपकाया) http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html#Lifecycle

3

मैं एक पुराना धागा खोद सकता हूं, लेकिन किसी ने भी एक महत्वपूर्ण बात का जिक्र नहीं किया।

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

try{ 
     db.beginTransaction(); 

     //Do whatever you need to do...  

     db.setTransactionSuccessful(); 
    }catch(SQLiteException e){ 
     Log.e("SQLite","Error while updating rows: " + e.getMessage()); 
    }finally{ 
     db.endTransaction(); //Commit (if everything ok) or rollback (if any error occured). 
     db.close(); //Close databse; 
    } 
संबंधित मुद्दे