2013-05-01 11 views
7

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

एंड्रॉयड आवेदन में ExecutorService उपयोग कर, और ध्यान में रखते हुए आवेदन राज्य में परिवर्तन के अपने अनुभव से, अगर मैं नहीं चाहिए करने के लिए लगातार बंद और फिर से बनाने के ऐसा करने से executorservice:

executor = Executors.newCachedThreadPool(); 
    executor.submit(some Runnable); 
    executor.shutdown(); 

, शटलडाउन सेवा के लिए आप किस समय और कहां से सहमत होंगे, और फिर इसे बहाल करें ताकि मैं कुछ रिसाव या कुछ अवांछित परिणामों को रोक सकूं?

मैं ज्यादातर के लिए reffering हूँ: backstack में पिछले गतिविधि पर वापस बटन द्वारा

1) समापन एप्लिकेशन (अनुप्रयोग कई गतिविधियों का उपयोग करता है) 2) आवेदन पृष्ठभूमि में जा रहा (उन गतिविधियों में से किसी पर) 3) आवेदन अग्रभूमि (किसी भी गतिविधि पर) में वापस जा रहा है

+2

कोई भी एक (या बंद सेट) बंद करने पर कुछ अच्छी युक्तियों वाले किसी भी व्यक्ति को एप्लिकेशन की शुरुआत में शुरू किया गया था? अगर निष्पादक सेवा बंद नहीं होती है, तो यह कचरा नहीं एकत्र किया जाएगा, और असल में आवेदन कचरा नहीं होगा (अगर निष्पादक सेवा को दिए गए कार्यों को गतिविधि, या कुछ अन्य प्रमुख वस्तु कहने के लिए कुछ संदर्भ हैं) भले ही यह बंद हो। क्या ऐसा करने के लिए कोई कृपा तरीका है? अब तक, जब भी मैंने कुछ सबमिट किया था, मैंने शटडाउन को बुलाया, और असल में मैंने निष्पादक सेवा को बार-बार बनाया।मेरी आंखों में अच्छा समाधान नहीं है ... – Lucas

उत्तर

8

आप एक काम कर सकते हैं। निष्पादक को डिमन के रूप में बनाएं। फिर जब आपका एप्लिकेशन निकलता है तो यह स्वचालित रूप से समाप्त हो जाएगा। आपको shutdown को स्पष्ट रूप से कॉल करने की आवश्यकता नहीं है।

ExecutorService es = Executors.newSingleThreadExecutor(new ThreadFactory() { 
    @Override 
    public Thread newThread(Runnable r) { 
     Thread t = new Thread(r); 
     t.setDaemon(true); 
     return t; 
    } 
}); 
+0

मैं वास्तव में इसके बारे में भूल गया, लेकिन किसी और चीज के संबंध में कहीं भी यह सुझाव पाया, और इसे पहले से ही पहले ही लागू कर दिया था। हालांकि, चूंकि आपने जवाब दिया, चेकमार्क आपका है। – Lucas

3

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

जैसा कि मैं स्मृति रिसाव से डरता था, मैं थ्रेडपूल एक्स्सेलर में भी देख रहा था और पता लगाने के लिए इसके साथ खेल रहा था।() Executors.newCachedThreadPool निम्नलिखित मानकों के साथ एक ThreadPoolExecutor बनाता है:: यह है कि मैं क्या पाया है

ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()) 

0 के एक corePoolSize, जिसका अर्थ है कि 0 कार्यकर्ता धागे की एक न्यूनतम संख्या को जीवित रखा जाता है, इसलिए कोई भी है कि। जब टीपीई (ए.के.ए. एक्जिक्यूटर्स सर्विस) एक कार्य निष्पादित करता है, तो यह एक कार्यकर्ता धागा बनाता है और इसे पूल में जोड़ता है। अब जब 60 सेकेंड के समय के दौरान कोई नया कार्य नहीं आता है, तब भी (जीवित रखा जाता है) कार्यकर्ता धागा को पूल (कैश) से हटा दिया जाता है और हटा दिया जाता है।

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

यदि मैं गलत हूं तो मुझे सही करने के लिए स्वतंत्र महसूस करें।

+1

Awsome खोजें। धन्यवाद सेबेस्टियन। मैंने अभी एक छोटा परीक्षण किया है और वास्तव में यह बिल्कुल सही व्यवहार करता है जैसा आपने इंगित किया था, और थ्रेडपूलएक्सएटर के दस्तावेज़ीकरण में लिखा गया है। यह दूसरा समाधान प्रतीत होता है, और अगर कोई थ्रेड को डेमन्स के रूप में नहीं बनाना चाहता है तो अधिक पसंद किया जाता है। यदि आप निष्पादक सेवा को ThreadPoolExecutor पर डालते हैं तो आप KeepAlive सेटिंग भी बदल सकते हैं। तो समाप्त करने के लिए, मुझे आपके द्वारा पेश किए गए मामले में कुछ भी गलत नहीं दिख रहा है और मैं अपनी अगली परियोजना में इसका उपयोग करने की कोशिश करूँगा। – Lucas

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