2011-02-07 19 views
8

मैं बिंदु जहां मैं गंजा जा रहा से दूर कुछ ही कदम हूँ पर आए हैं ...एंड्रॉयड सेवा बंद

मैं एक सेवा है जो जाँच करेगा चलाने के लिए कोशिश कर रहा हूँ मेरे काम पर सर्वर चला रहे हैं । यह हर 5 मिनट में ऐसा करने वाला है।

मैं टाइमरटास्क, अनुसूचितExecutorService और अंत में हैंडलर के माध्यम से किया गया है। वे सभी कुछ गलतता के अलावा, कुछ घंटे के लिए "ठीक" काम करते हैं, 1-5 मिनट दूर, और फिर अचानक "टाइमर" फायरिंग बंद कर देता है।

अब, मैंने पढ़ा है कि अगर शेड्यूलर बिना किसी अपवाद के सामना कर रहा है तो रोक देगा, और मुझे यकीन है कि टाइमरटास्क के साथ-साथ लॉग फाइलों की जांच भी हो रही है, लेकिन इसमें कोई अपवाद नहीं है ...

जब मैं आज काम से घर आया तो मैंने हैंडलर के साथ एक प्रयोग करने का फैसला किया।

मैंने 2 हैंडलर बनाए, एक सर्वर को जांचने और एक समय में एक int बढ़ाने के लिए कोड चलाएगा। दूसरा सिर्फ कहा int के मूल्य को लॉग करेगा, ताकि इसे रोकने के लिए इसे अपवाद का सामना करना पड़े (मुझे नहीं पता कि यह कैसा होगा)।

यह कुछ घंटों के लिए महान चलाता है, हमेशा की तरह 1-5 मिनट अशुद्धि के साथ, और फिर बंद हो जाता है, नीचे दिए गए है लॉग से पिछले लाइनों:

02-07 20:03:25.892 D/dalvikvm( 992): GC_EXPLICIT freed 192K, 53% free 4295K/9031K, external 3755K/4825K, paused 114ms 
02-07 20:03:35.572 D/dalvikvm(5472): GC_EXPLICIT freed <1K, 54% free 2895K/6279K, external 2002K/2137K, paused 61ms 
02-07 20:04:42.212 V/ServerChecker(12568): Timer triggered 
02-07 20:04:42.212 V/ServerChecker(12568): Checking: linux15 
02-07 20:04:44.152 V/ServerChecker(12568): Checked: linux15 
02-07 20:04:44.152 V/ServerChecker(12568): Checking: linux1 
02-07 20:04:44.462 V/ServerChecker(12568): Checked: linux1 
02-07 20:04:44.462 V/ServerChecker(12568): Checking: linux12 
02-07 20:04:44.762 V/ServerChecker(12568): Checked: linux12 
02-07 20:04:44.762 V/ServerChecker(12568): Checking: linux9 
02-07 20:04:45.072 V/ServerChecker(12568): Checked: linux9 
02-07 20:04:45.072 V/ServerChecker(12568): Checking: linux14 
02-07 20:04:45.382 V/ServerChecker(12568): Checked: linux14 
02-07 20:04:45.382 V/ServerChecker(12568): Test timer triggered: 13 
02-07 20:05:01.002 E/InputDispatcher( 223): channel '406cefc8 com.n04dev.serverchecker/com.n04dev.serverchecker.ServerChecker (server)' ~ Consumer closed input channel or an error occurred. events=0x8 
02-07 20:05:01.002 E/InputDispatcher( 223): channel '406cefc8 com.n04dev.serverchecker/com.n04dev.serverchecker.ServerChecker (server)' ~ Channel is unrecoverably broken and will be disposed! 
02-07 20:05:08.932 D/dalvikvm(12842): GC_EXPLICIT freed 73K, 51% free 2641K/5379K, external 2002K/2137K, paused 37ms 
02-07 20:05:09.132 D/dalvikvm( 185): GC_EXPLICIT freed 11K, 53% free 2554K/5379K, external 2002K/2137K, paused 96ms 
02-07 20:05:12.022 D/dalvikvm( 185): GC_EXPLICIT freed <1K, 53% free 2554K/5379K, external 2002K/2137K, paused 164ms 
02-07 20:05:12.062 D/dalvikvm( 185): GC_EXPLICIT freed <1K, 53% free 2554K/5379K, external 2002K/2137K, paused 36ms 
02-07 20:05:18.612 D/dalvikvm(12852): GC_EXPLICIT freed 59K, 52% free 2596K/5379K, external 2002K/2137K, paused 72ms 

मैं पिछले दो संदेशों को देखा है मेरे ऐप से संबंधित और this thread मिला - लेकिन मैं नहीं देख सकता कि यह मेरे मामले में कैसे लागू होगा।

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

उत्तर

14

मैं टाइमरटास्क, अनुसूचितExecutorService और अंत में हैंडलर के माध्यम से किया गया है। वे सभी कुछ घंटों के लिए "ठीक" काम करते हैं, कुछ गलतता को छोड़कर, 1-5 मिनट दूर, और फिर अचानक "टाइमर" फायरिंग बंद कर देता है।

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

वास्तविक कार्य करने के लिए अपना शेड्यूल और IntentService सेट अप करने के लिए AlarmManager का उपयोग करें। IntentService स्वचालित रूप से आपको अपने नेटवर्क I/O के लिए अपना पृष्ठभूमि थ्रेड देता है, और जब कार्य पूरा हो जाता है तो यह स्वचालित रूप से सेवा को बंद कर देता है।

यदि आप सोते हैं तो डिवाइस होने पर भी ऐसा होने का इरादा है, _WAKEUP अलार्म AlarmManager और मेरे WakefulIntentService (या उन पंक्तियों के साथ कुछ) के साथ अलार्म का उपयोग करें।

+3

हां, एंड्रॉइड ओएस में "सेवा" शब्द विंडोज सेवा की तरह कुछ नहीं है, जो हमेशा पृष्ठभूमि में चलता है - एक एंड्रॉइड सेवा केवल एक ऐसा एप्लीकेशन है जिसका कोई फ्रंट-एंड नहीं है, और इसलिए मानक के अधीन है स्मृति प्रबंधन/सफाई। एक इरादा बुलावा अलार्म निश्चित रूप से जाने का रास्ता है। –

+0

धन्यवाद मार्क, यह चाल है - यह अब 9 घंटे के लिए नॉनस्टॉप चला रहा है, सटीक 5 मिनट के निशान पर गोलीबारी कर रहा है :) - और उस स्पष्टीकरण के लिए लड़का धन्यवाद – noir04

+0

मुझे एक ही समस्या का सामना करना पड़ रहा है - हालांकि यह कभी नहीं मेरे लिए यह हुआ कि यह हमारी सेवा से संबंधित हो सकता है ... हमें एक सेवा मिली जो चलती है, और फिर थ्रेड स्लीप्स, थोड़ी देर के बाद जागती है ... मुझे आश्चर्य है कि यह संबंधित हो सकता है, क्योंकि मुझे वही मिल रहा है त्रुटि। – AgentKnopf

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