2010-06-19 12 views
113

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

परिणाम वहां बड़ी संख्या में AsyncTask धागे बस बैठे हैं। मुझे यकीन नहीं है कि यह अभ्यास में एक समस्या है या नहीं, लेकिन मैं वास्तव में उन अतिरिक्त धागे से छुटकारा पाना चाहता हूं।

मैं इन धागे को कैसे मार सकता हूं?

+0

क्या आप के साथ "कभी नहीं समाप्त" मतलब है? क्या कार्य कभी भी अपनी डॉकबैंडग्राउंड विधि को समाप्त नहीं करता है या क्या आप आवंटन व्यापारी में एसिंक्टास्क ऑब्जेक्ट देखते हैं? –

+7

'doInBackground' विधि पूर्ण हो जाती है, लेकिन थ्रेड विंडो में थ्रेड दिखाना जारी रहता है। उदाहरण के लिए: 'थ्रेड [<23> AsyncTask # 4] (चल रहा है)' – Computerish

उत्तर

199

AsyncTaskThreadPoolExecutor के साथ बनाया गया एक थ्रेड पूल प्रबंधित करता है। इसमें 5 से 128 धागे होंगे। यदि 5 से अधिक धागे हैं, तो उन अतिरिक्त धागे हटाए जाने से पहले लगभग 10 सेकंड तक चिपके रहेंगे। (ध्यान दें: ये आंकड़े वर्तमान में दिखाई देने वाले ओपन सोर्स कोड के लिए हैं और एंड्रॉइड रिलीज द्वारा भिन्न होते हैं)।

कृपया AsyncTask अकेले धागे छोड़ दें, कृपया।

+0

uff! सुनकर अच्छा लगा! हेहे :) –

+0

स्पष्टीकरण के लिए धन्यवाद! मुझे यह जानकर खुशी हो रही है कि मैं कुछ भी गलत नहीं कर रहा हूं। जिज्ञासा से, ऐसा क्यों डिज़ाइन किया गया है? सभी विधियों के लौटने के बाद धागे को खत्म क्यों न करें? – Computerish

+7

संभावित रूप से बाद के अनुरोधों पर धागे को फेंकने के समय को बचाने के लिए। – CommonsWare

23

CommonsWare की प्रतिक्रिया के अलावा:

वर्तमान में मैं Android 2.2 का उपयोग कर रहा है, और अपने आवेदन किसी भी समय एक से अधिक AsyncTask का उपयोग करता है, लेकिन मैं एक नया बनाने रहा हूँ हर x मिनट। पहले नए AsyncTask थ्रेड्स दिखाई देने लगते हैं (एक नए AsyncTask के लिए एक नया थ्रेड) लेकिन 5 धागे के बाद (जैसा कि कॉमन्सवेयर द्वारा उल्लिखित है) वे बस डीबग विंडो में दिखाई देते हैं, और नए AsyncTask थ्रेड की आवश्यकता होने पर पुनः उपयोग किया जाता है। जब तक डीबगर डिस्कनेक्ट नहीं हो जाता तब तक वे वहां रहते हैं।

+2

हां, पुष्टि की गई: मुझे 5 से अधिक AsyncTasks दिखाई नहीं दे रहा है। –

3

वही लक्षण यहां। मेरे मामले में मैंने गतिविधि को मारने के बाद चारों ओर फांसी फेंक दी, और मैं ऐप को पूरी तरह से बंद करने की उम्मीद कर रहा था। समस्या को एक थ्रेडेड एक्जिक्यूटर का उपयोग करके आंशिक रूप से हल किया गया:

myActiveTask.executeOnExecutor(Executors.newSingleThreadExecutor()); 

इसने धागा को अपना काम पूरा करने के बाद गायब कर दिया।

+0

इस जवाब ने AsyncTask को चलाने के बाद इसे दूर कर दिया, शायद यह "सामान करने का Google तरीका" नहीं है लेकिन यह काम पूरा हो जाता है। धन्यवाद। –

+0

इसने एक थ्रेड पर असिंक्टस्क चलाने के बारे में मेरी विशिष्ट समस्या हल की। –

0

ThreadPoolExecutor का उपयोग करें।

BlockingQueue workQueue= new LinkedBlockingQueue<Runnable>(100); // Work pool size 
ThreadPoolExecutor executor = new ThreadPoolExecutor(
      Runtime.getRuntime().availableProcessors(),  // Initial pool size 
      Runtime.getRuntime().availableProcessors(),  // Max pool size 
      1, // KEEP_ALIVE_TIME 
      TimeUnit.SECONDS, // KEEP_ALIVE_TIME_UNIT 
      workQueue); 

पोस्ट अपने Runnableexecute() विधि का उपयोग कर कार्य।

void execute (Runnable command) 

भविष्य में कुछ समय दिए गए कार्य पर क्रियान्वित। काम के लिए एक नया सूत्र में या एक मौजूदा जमा धागा

में निष्पादित कर सकते हैं अपने दूसरे प्रश्न के बारे में:

मैं इन धागों को मार सकता है?

एक बार जब आप ThreadPoolExecutor, बंद के रूप में यह ठीक से पोस्ट के नीचे में उद्धृत के साथ अपने सभी काम के साथ किया जाता है:

How to properly shutdown java ExecutorService

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