2010-04-26 8 views
44

documentation on AsyncTask में यह निम्नलिखित देता सूत्रण से संबंधित एक नियम के रूप:AsyncTask थ्रेडिंग नियम - क्या यह वास्तव में केवल एक बार उपयोग किया जा सकता है?

  • कार्य केवल एक बार निष्पादित किया जा सकता है (अगर एक दूसरे निष्पादन का प्रयास किया है एक अपवाद फेंक दिया जाएगा।)

इसका मतलब यह है कि जब भी आप इसका उपयोग करना चाहते हैं, तो आपको कक्षा का एक नया उदाहरण बनाना होगा, है ना? दूसरे शब्दों में, यह इस तरह से किया जाना चाहिए:

new DownloadFilesTask().execute(url1, url2, url3); 
new DownloadFilesTask().execute(url4, url5, url6); 

या इसके विपरीत, आप नहीं कर सकते हैं निम्नलिखित:

DownloadFilesTask dfTask = new DownloadFilesTask(); 
dfTask.execute(url1, url2, url3); 
dfTask.execute(url4, url5, url6); 

किसी को सत्यापित कर सकते हैं कि यह एक सटीक व्याख्या है?

मुझे एहसास है कि मैंने इसे अपने लिए उत्तर दिया है क्योंकि मैं इसे लिख रहा था ... लेकिन यह मेरे लिए तुरंत स्पष्ट नहीं था इसलिए मुझे लगता है कि यह पोस्ट करने के लिए उपयोगी होगा।

उत्तर

97

क्या कोई यह सत्यापित कर सकता है कि यह एक सटीक व्याख्या है?

यह एक बहुत ही सटीक व्याख्या है।

+37

सर्वोत्तम उत्तर कभी भी। – Adam

+3

पुराना SO प्रश्न पढ़ना और मुझे यह बेहद मनोरंजक उत्तर मिल गया। मैं हँसे, और यह एक बहुत कुछ था। – davidcesarino

7

AsyncTasks के साथ एक और गॉचाचा है। कृपया ध्यान दें कि उदाहरण

new DownloadFilesTask().execute(url1, url2, url3); 
new DownloadFilesTask().execute(url4, url5, url6); 

एंड्रॉयड पर निष्पादित 3+ (एपीआई स्तर 11, मधुकोश) url1 और url4समानांतर में डाउनलोड किया जा नहीं करेंगे। विशेष रूप से, यदि url1 से संपर्क करने का समय समाप्त हो रहा है, तो url4 पर स्थानांतरण तब तक शुरू नहीं होगा जब तक कि यह समय समाप्त न हो जाए। जब तक आप अन्यथा स्पष्ट रूप से निर्दिष्ट नहीं करते हैं, तब तक सभी AsyncTasks को एक ही कार्यकर्ता थ्रेड द्वारा सर्विस किया जाता है।

डॉक्स कहते हैं:

निष्पादन

जब पहली बार शुरू की के आदेश, AsyncTasks एक भी पृष्ठभूमि धागे पर क्रमानुसार मार डाला गया। डोनट से शुरू होने पर, यह थ्रेड के पूल में बदल दिया गया था जिससे कई कार्यों को समानांतर में संचालित किया जा सकता था। HONEYCOMB से शुरू होने पर, समानांतर निष्पादन के कारण सामान्य अनुप्रयोग त्रुटियों से बचने के लिए कार्यों को एकल थ्रेड पर निष्पादित किया जाता है।

आप वास्तव में समानांतर निष्पादन चाहते हैं, आप executeOnExecutor (java.util.concurrent.Executor, [] वस्तु) आह्वानTHREAD_POOL_EXECUTOR साथ कर सकते हैं।

+1

हालांकि, कृपया ध्यान दें कि प्रश्न एक पूरी तरह से अलग बिंदु पर है - चाहे AsyncTask का एक उदाहरण पुन: उपयोग किया जा सकता है। –

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