Android में Asynctask vs Thread


135

UI में, कुछ पृष्ठभूमि का काम करने के लिए, मैंने एक अलग प्रयोग किया Thread। लेकिन जैसा कि दूसरों द्वारा सुझाया गया है, मैं अब उपयोग कर रहा हूं AsyncTask

A Threadऔर a के बीच मुख्य अंतर क्या है AsyncTask?

किस परिदृश्य में, मुझे a Threadया a का उपयोग करना चाहिए AsyncTask?



@ webaldo.at मैंने इस पर फिर से विचार किया, यहाँ उन्होंने Asynctask और Thread.I के बीच विवरण और अंतर दर्ज किया है। मैं जानना चाहता हूं कि उदाहरण के लिए नेटवर्क कनेक्शन के लिए कौन सा मामला है, इसके लिए फ़ाइल पढ़ें।
राम

छोटा: थ्रेड -> यूआई-थ्रेड तक कोई पहुंच नहीं || Asynctask -> UI- थ्रेड के लिए सशर्त पहुंच
JavaDM

बैकग्राउंड टास्क के लिए IntentService एक और अच्छा विकल्प है।
चेन

जवाबों:


146

लंबे समय से चल रहे या सीपीयू-गहन कार्यों के लिए, मूल रूप से ऐसा करने के दो तरीके हैं: जावा थ्रेड्स, और एंड्रॉइड के मूल AsyncTask।

न तो एक जरूरी दूसरे से बेहतर है, लेकिन यह जानने के लिए कि प्रत्येक कॉल का उपयोग करने के लिए आपके लाभ के लिए सिस्टम के प्रदर्शन का लाभ उठाना आवश्यक है।

इसके लिए AsyncTask का उपयोग करें:

  1. सरल नेटवर्क संचालन जिन्हें बहुत अधिक डेटा डाउनलोड करने की आवश्यकता नहीं होती है
  2. डिस्क-बाउंड कार्य जो कुछ मिलीसेकंड से अधिक हो सकते हैं

इसके लिए जावा थ्रेड्स का उपयोग करें:

  1. नेटवर्क संचालन जिसमें बड़ी मात्रा में डेटा शामिल है (या तो अपलोड करना या डाउनलोड करना)
  2. उच्च-सीपीयू कार्य जिन्हें पृष्ठभूमि में चलाने की आवश्यकता है
  3. कोई भी कार्य जहां आप GUI थ्रेड के सापेक्ष CPU उपयोग को नियंत्रित करना चाहते हैं

और इंटरनेट पर बहुत सारे अच्छे संसाधन हैं जो आपकी मदद कर सकते हैं:

http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html


क्या मैं पूछ सकता हूं कि डाउनलोड डेटा राशि एक समस्या क्यों है?
यंग

1
@Yeung लगता है जैसे आपको Async टास्क के बारे में अंतर्दृष्टि की आवश्यकता है! देखिए, डेटा राशि को बड़ा करें और स्पष्ट रूप से उसी ऑपरेशन को पूरा करने में लगने वाले समय को बड़ा करें। इसलिए निम्न कारणों से Async टास्क का उपयोग करके लंबे समय तक चलने वाली प्रक्रिया को करना एक अच्छा अभ्यास नहीं है: 1. Async टास्क को खराब तरीके से गतिविधि जीवन चक्र से जोड़ा जाता है। 2. वे मेयोमरी लीक बनाते हैं।
मोहित

3
इस पर एक नज़र डालें: stackoverflow.com/questions/12797550/…
मोहित

धन्यवाद। मैं अब जोखिम को समझता हूं।
यंग

@Impasse @Yeung IMO राशि का डेटा एक समस्या नहीं है, नेटवर्क संचालन के साथ प्रमुख समस्या यह ऑपरेशन का समय है। यहां तक ​​कि कुछ बाइट्स को डाउनलोड करने में एक लंबा समय लग सकता है, जब सर्वर व्यस्त होता है, अगम्य (टाइमआउट) आदि। एक फिक्स AsyncTaskअपने स्वयं के अनुसूचक के साथ उपयोग करने के लिए हो सकता है ।
xmedeko

44

यदि आप जावा थ्रेड का उपयोग करते हैं, तो आपको अपने कोड में निम्नलिखित आवश्यकताओं को संभालना होगा:

यदि आप उपयोगकर्ता इंटरफ़ेस पर वापस परिणाम पोस्ट करते हैं तो मुख्य सूत्र के साथ सिंक्रनाइज़ेशन

धागा रद्द करने के लिए कोई डिफ़ॉल्ट नहीं

कोई डिफ़ॉल्ट थ्रेड पूलिंग नहीं

Android में कॉन्फ़िगरेशन परिवर्तन से निपटने के लिए कोई डिफ़ॉल्ट नहीं है


3
यह वास्तव में अधिक स्पष्ट है क्योंकि यह सरल थ्रेड्स का उपयोग न करने के कारणों से निपटता है। मेरे मन के शीर्ष से, कुछ भी जो गतिविधि / सेवा जीवन चक्र से जुड़ा होना चाहिए, इसके बजाय AsyncTask का उपयोग करना चाहिए, भले ही आपको कार्य के अंदर मैन्युअल रूप से "शालीनतापूर्वक" नीचा दिखाने की आवश्यकता हो, कम से कम आप कार्य हैंग के साथ समाप्त नहीं होते हैं जब गतिविधि को मार दिया जाता है।
leRobot

28

धागा

  • सामान्य रूप से लंबा कार्य
  • थ्रेड.स्टार्ट () विधि द्वारा आह्वान करें
  • किसी भी धागे से ट्रिगर
  • अपने ही धागे पर चलता है
  • मैनुअल थ्रेड प्रबंधन / कोड को पढ़ना मुश्किल हो सकता है

AsyncTask

  • छोटे काम मुख्य धागे के साथ संवाद करने के लिए
  • बहाना () विधि द्वारा आह्वान करें
  • मुख्य धागे से ट्रिगर
  • कार्यकर्ता धागे पर चलता है
  • मुख्य धागे से निष्पादित और बनाया जाना चाहिए

11

धागा

एक धागा निष्पादन की एक समवर्ती इकाई है। इसकी अपनी कॉल स्टैक है। अनुप्रयोगों में थ्रेड्स को लागू करने के लिए दो विधियाँ हैं।

कोई एक नया वर्ग प्रदान कर रहा है जो थ्रेड का विस्तार करता है और इसकी रन () विधि को ओवरराइड करता है। दूसरा अपने निर्माण के दौरान एक रननेबल ऑब्जेक्ट के साथ एक नया थ्रेड इंस्टेंस प्रदान कर रहा है। एक धागे को "प्रारंभ" विधि कहकर निष्पादित किया जा सकता है। आप किसी थ्रेड की "प्राथमिकता" को उसकी "सेटपैरिटी (int)" विधि कह कर सेट कर सकते हैं।

यदि आपके पास UI भाग में कोई प्रभाव नहीं है, तो एक थ्रेड का उपयोग किया जा सकता है। उदाहरण के लिए, आप कुछ वेब सेवा को कॉल कर रहे हैं या कुछ डेटा डाउनलोड कर रहे हैं, और डाउनलोड करने के बाद, आप इसे अपनी स्क्रीन पर प्रदर्शित कर रहे हैं। फिर आपको थ्रेड के साथ एक हैंडलर का उपयोग करने की आवश्यकता है और इससे थ्रेड्स से सभी प्रतिक्रियाओं को संभालने के लिए आपका एप्लिकेशन जटिल हो जाएगा।

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

यदि आप जावा थ्रेड का उपयोग करते हैं तो आपको अपने कोड में निम्नलिखित आवश्यकताओं को संभालने की आवश्यकता है:

यदि आप उपयोगकर्ता इंटरफ़ेस पर वापस परिणाम पोस्ट करते हैं तो मुख्य थ्रेड के साथ सिंक्रनाइज़ेशन थ्रेड को रद्द करने के लिए कोई डिफ़ॉल्ट नहीं है। डिफ़ॉल्ट थ्रेड पूलिंग नहीं एंड्रॉइड में कॉन्फ़िगरेशन परिवर्तनों को संभालने के लिए कोई डिफ़ॉल्ट नहीं है।

AsyncTask

AsyncTask UI थ्रेड का उचित और आसान उपयोग सक्षम करता है। यह वर्ग थ्रेड और / या हैंडलर में हेरफेर किए बिना यूआई थ्रेड पर पृष्ठभूमि के संचालन और प्रकाशन परिणामों को प्रदर्शित करने की अनुमति देता है। एक अतुल्यकालिक कार्य एक संगणना द्वारा परिभाषित किया जाता है जो एक पृष्ठभूमि थ्रेड पर चलता है और जिसका परिणाम UI थ्रेड पर प्रकाशित होता है।

AsyncTask निम्नलिखित 4 चरणों से गुजरेगा:

onPreExecute ()

कार्य निष्पादित होने से पहले UI थ्रेड पर शामिल किया गया

doInbackground (पैरामीटर ..)

OnPreExecute () के क्रियान्वयन के तुरंत बाद पृष्ठभूमि थ्रेड में शामिल किया गया।

onProgressUpdate (प्रगति ..)

पब्लिशप्रोग्रेड (प्रगति ...) के लिए कॉल के बाद यूआई थ्रेड पर आमंत्रित किया गया।

onPostExecute (परिणाम)

पृष्ठभूमि की गणना खत्म होने के बाद UI थ्रेड पर आमंत्रित किया गया।

आपको AsyncTask का उपयोग क्यों करना चाहिए?

UI थ्रेड के लिए उपयोग करना आसान है। (इसलिए, जब कॉलर थ्रेड UI थ्रेड है, तो इसका उपयोग करें)।

हैंडलर में हेरफेर करने की कोई जरूरत नहीं है।

अधिक जानकारी के लिए यहां देखें


2

थ्रेड:

Threadमुख्य थ्रेड से लंबे समय तक चलने वाले संचालन को अलग करने के लिए उपयोग किया जाना चाहिए ताकि प्रदर्शन में सुधार हो। लेकिन इसे सुरुचिपूर्ण ढंग से रद्द नहीं किया जा सकता है और यह एंड्रॉइड के कॉन्फ़िगरेशन परिवर्तनों को संभाल नहीं सकता है। आप यूआई से अपडेट नहीं कर सकते Thread

AsyncTaskअवधि में 5ms से कम काम की वस्तुओं को संभालने के लिए इस्तेमाल किया जा सकता है। इसके साथ AsyncTask, आप जावा के विपरीत यूआई को अपडेट कर सकते हैं Thread। लेकिन लंबे समय तक चलने वाले कई कार्य प्रदर्शन को प्रभावित करेंगे।

आप दोनों के पास कुछ और विकल्प हैं।

HandlerThread / हैंडलर और ThreadPoolExecutor

अधिक जानकारी के लिए नीचे पोस्ट देखें:

हैंडलर बनाम AsyncTask बनाम थ्रेड

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.