2012-12-17 15 views
20

चल रहा है मेरे पास मेरे एप्लिकेशन में एक स्पलैशएक्टिविटी है जो मेरे एप्लिकेशन को शुरू करते समय AsyncTask का उपयोग करके कुछ सामान करता है।समानांतर AsyncTask

मैंने एक और AsyncTask भी बनाया है जो सर्वर से डेटा डाउनलोड करता है। अब जब मैं अपना एप्लिकेशन बंद करता हूं तो AsyncTask अभी भी डेटा डाउनलोड कर रहा है।

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

तो मेरा सवाल यह है कि हम दो AsyncTask समानांतर नहीं चला सकते हैं? AsyncTask दोनों अलग हैं और अपनी खुद की सामग्री कर रहे हैं। क्या ऐसा करने का कोई तरीका है।

+0

कृपया प्रासंगिक कोड (कार्य और कॉलिंग गतिविधि) पोस्ट करें –

उत्तर

30

AsyncTask निष्पादित करने के लिए आपको thread pool Executor का उपयोग करने की आवश्यकता होगी। डिफ़ॉल्ट कार्यान्वयन एक सीरियल निष्पादक तो एक ThreadPoolExecutor बनाने और उसके बाद का उपयोग किसी एकल थ्रेड

पर चल रहा है का उपयोग करता है

AsyncTask के executeOnExecutor बजाय सिर्फ निष्पादित विधि

+0

क्या इस विधि का उपयोग करके कुछ प्रकार की कमी है। अर्थात। क्या आपको AsyncTask समानांतर बनाकर कुछ अतिरिक्त काम करना है? –

+2

@ डिफ़ॉल्ट निष्पादक का उपयोग करके @ Gee.E बेहतर है क्योंकि केवल एक थ्रेड तत्काल है, इसलिए यदि आपके पास एक ही समय में बहुत से कार्य नहीं चल रहे हैं, तो डिफ़ॉल्ट निष्पादक बेहतर प्रदर्शन प्रदान करता है, लेकिन यदि कोई एसिंक्टास्क है जो बहुत कुछ लेता है समय के साथ, आपको ThreadPoolExecutor – nandeesh

+0

@ नंदेश रोजर की आवश्यकता हो सकती है, मैं एक कैश किए गए डेटाबेस से डेटा लाने के लिए समानांतर कार्य का उपयोग कर रहा हूं। जटिल कारणों से मुझे समानांतर चलाने के लिए फ़ेचर-कार्य की आवश्यकता है, लेकिन जब से यह समय लगता है नगण्य है तो मुझे कोई प्रदर्शन डुबकी दिखाई नहीं दे रही है। भले ही, इस मुद्दे को समझाने के लिए धन्यवाद। –

35

हनीकोम्ब रिलीज से AsyncTask में एक परिवर्तन किया गया है की। पुराने संस्करणों में 10 धागे का थ्रेड पूल था, ताकि आप समानांतर में 10 कार्य चला सकें। लेकिन हनीकॉम और अप के लिए, डिफ़ॉल्ट एक धारावाहिक निष्पादक है, जो कार्यों को एक-एक करके निष्पादित करता है। लेकिन आप निष्पादन के लिए एक ThreadPoolExecutor पारित कर सकते हैं:

if (Build.VERSION.SDK_INT >= 11) { 
    //--post GB use serial executor by default -- 
    task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
    } else { 
    //--GB uses ThreadPoolExecutor by default-- 
    task.execute(); 
    } 
+3

आपको अंतिम तर्क 'नया शून्य [] {} 'निर्दिष्ट करने की आवश्यकता नहीं है; इसे छोड़ना पर्याप्त होगा। –

+0

आपका आईडीई गलत है; varargs सरणी बनाने के लिए शॉर्टकट हैं, तो निश्चित रूप से पैरामीटर सूची खाली हो सकती है। वास्तव में, आपके जैसे एक नई सरणी प्रदान करना वास्तव में खराब अभ्यास है; आप एक वस्तु को तत्काल तत्काल कर रहे हैं। जीसी को फिर से साफ करने के लिए कुछ मिलसेकंड के लिए चारों ओर आना होगा और अपने ऐप को रोकना होगा। –

+0

धन्यवाद! एक जादू की तरह काम करता है। और एंड्रॉइड प्रलेखन इस पर कोई स्पष्ट नहीं हो सकता: "सार्वजनिक स्थिर अंतिम निष्पादक THREAD_POOL_EXECUTOR। एपीआई स्तर 11 में जोड़ा गया - एक निष्पादक जिसका उपयोग समानांतर में कार्यों को निष्पादित करने के लिए किया जा सकता है।" – Luis

5

एक अन्य विकल्प समर्थन v.4 पुस्तकालय से AsyncTaskCompat उपयोग कर रहा है।

AsyncTaskCompat.executeParallel(new AsyncTask<Void, Void, Object>() { 
    @Override 
    protected Object doInBackground(Void... params) { 
     // do your parallel task here 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Object result) { 
     // and fetch result 
    } 
}); 
+1

यह कक्षा API स्तर 26 में बहिष्कृत थी और API स्तर 27 में हटा दी गई थी –