2012-03-07 27 views
6

यह एक आसान जवाब होना चाहिए, फिर भी मुझे कोई नहीं मिला। और चूंकि मैं अभी भी एक एंड्रॉइड डमी हूं, मैं यहां लोगों से पूछने आया हूं।क्या एक ही समय में AsyncTasks को निष्पादित करने की कोई सीमा है?

मैं इस प्रोजेक्ट को बना रहा हूं जो स्टार्टअप पर 10 AsyncTasks निष्पादित करता है। प्रत्येक कार्य में 3 यूआरएल होते हैं जो वहां डेटा एकत्र करते हैं और ऐप (अभी तक) में कुछ भी महत्वपूर्ण नहीं करते हैं।

मेरे पास 10 टेक्स्टव्यू भी हैं जिनका उपयोग मैं AsyncTasks की प्रगति का ट्रैक रखने के लिए करता हूं।

एक कार्य शुरू होता है उचित TextView "प्रारंभ" पर डाल दिया जाता है जब कोई कार्य वह अपने उचित TextView करने के लिए "डाउनलोड कर रहा है" जब कोई कार्य समाप्त हो गया है कि वह अपने उचित TextView सेट "समाप्त" करने के लिए

सेट प्रगति पर है

मैंने यही देखा और AsyncTask के बारे में सवाल करने आया। जब मैं ऐप शुरू करता हूं तो मुझे "डाउनलोडिंग" मार्कर पर स्विच किए जा रहे टेक्स्टव्यू में से 5 नोटिस मिलते हैं, इसलिए मुझे लगता है कि 5 AsyncTasks अपनी नौकरी कर रहे हैं जैसा उन्हें करना चाहिए। जब किया जाता है तो यह एक नया AsyncTask शुरू होता है। फिर भी वे 5 की उस सीमा तक कभी नहीं पहुंचते हैं।

एक ही समय में 5 AsynchTasks की इस सीमा का क्या कारण बनता है? क्या मैंने इसे कुछ फाइल में किया जो मुझे नहीं मिला? क्या यह एंड्रॉइड 2.3.3 की एक सीमा है? शायद ऐप को सिम करने के लिए मैं जिस डिवाइस का उपयोग कर रहा हूं उसकी एक सीमा?

क्या कोई मेरे लिए विस्तार कर सकता है?

+0

यह प्रश्न यहां संबोधित किया गया है: http://stackoverflow.com/questions/3077461/asynctask-threads-never-die-android – jengelsma

+0

@jengelsma वास्तव में नहीं। यह निश्चित रूप से संबंधित है, लेकिन यह 5 से अधिक क्यों नहीं जाता है, यह कुछ अलग क्यों है, यह कभी भी 5 वर्ष से कम क्यों नहीं होता है। यह अभी भी मूल पूल आकार के साथ करना है, लेकिन उस प्रश्न/उत्तर को पता नहीं है कि कोर पूल आकार सीमित क्यों होगा अधिकतम पूल आकार 128 होने पर समवर्ती कार्यों की संख्या 128. – kabuko

+0

मुझे लगता है कि आप AsyncTask.executeOnExecutor() –

उत्तर

8

हां, एक सीमा है। AsyncTask को 512 के कोर पूल आकार के साथ ThreadPoolExecutor द्वारा समर्थित किया गया है, लेकिन अधिकतम पूल आकार 128 (1.6 - 4.0.3 से) है, इसलिए वास्तव में मुझे लगता है कि आपको अपने सभी 10 रन एक बार में देखना चाहिए। हालांकि आप इसे बदल नहीं सकते हैं। यदि आप वास्तव में कुछ अलग करना चाहते हैं (और जब तक आपके पास कोई विशिष्ट कारण नहीं है तब तक मैं इसकी अनुशंसा नहीं करता), आपको बड़े पूल आकार के साथ कुछ कस्टम करना होगा या मैन्युअल रूप से धागे का एक गुच्छा स्पिन करना होगा।

अद्यतन:

यहाँ डॉक्स क्या कहना है:

हैं की तुलना में maximumPoolSize धागे चल corePoolSize की तुलना में अधिक है, लेकिन कम देखते हैं, एक नया धागा बनाया जाएगा केवल अगर कतार भर गई है।

इसलिए यही कारण है। आपकी कतार पूर्ण नहीं है, इसलिए यह इसे कोर पूल आकार में रखती है।

+0

के बजाय AsyncTask.execute() का उपयोग कर रहे हैं। यहां [AsyncTask] के स्रोत का एक लिंक है (http: // grepcode संदर्भ के लिए .com/file/repository.grepcode.com/जावा/ext/com.google.android/एंड्रॉइड/1.6_r2/एंड्रॉइड/ओएस/AsyncTask.java # AsyncTask)। – kabuko

+2

यदि आप अनुकूलित करना चाहते हैं कि आपके 'AsyncTask' को कैसे प्रबंधित किया जाए, तो आप निष्पादित करने के लिए 'executeOnExecutor()' पर एक मनमानी 'निष्पादक' उदाहरण प्रदान कर सकते हैं। – Argyle

+1

@ अरगी अच्छा बिंदु; यह एपीआई 11 और ऊपर के लिए एक अच्छा विकल्प है। – kabuko

0

थ्रेडपूलएक्सएटर के पास कोरपूलसाइज, अधिकतमपूलसाइज और क्यूई कैपेसिटी है। यदि कोरपूलसाइज से आपके सभी धागे का उपयोग किया जाता है, तो किसी अन्य कार्य को कोर पूल से प्रत्येक थ्रेड की कतार में रखा जाता है। इन कतारों के पूर्ण होने के बाद, जब तक यह maxPoolSize की सीमाओं के भीतर होता है, तब तक एक नया धागा प्रारंभ किया जा रहा है।

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

आपको अपने स्वयं के निष्पादक को कॉन्फ़िगर करना होगा और कतार क्षमता को बदलना होगा। सौभाग्य!