AsyncTask <arg1, arg2, arg3> में क्या तर्क दिए गए हैं?


157

मुझे समझ में नहीं आ रहा है कि मैं यहाँ क्या करने वाला हूँ और ये तर्क कहाँ खत्म होते हैं? वास्तव में मुझे क्या करना चाहिए, और यह वास्तव में कहां जाएगा? क्या मुझे सभी 3 को शामिल करने की आवश्यकता है या क्या मैं 1,2,20 को शामिल कर सकता हूं?

जवाबों:


496

Google का Android दस्तावेज़ कहता है कि:

एक अतुल्यकालिक कार्य को 3 सामान्य प्रकारों द्वारा परिभाषित किया जाता है, जिन्हें परम, प्रगति और परिणाम, और 4 चरण, onPreExecute, doInBackground, onProgressUpdate और onPostExecute कहा जाता है।

AsyncTask के सामान्य प्रकार:

अतुल्यकालिक कार्य द्वारा उपयोग किए जाने वाले तीन प्रकार निम्नलिखित हैं:

Params, the type of the parameters sent to the task upon execution.
Progress, the type of the progress units published during the background computation.
Result, the type of the result of the background computation.

सभी प्रकार हमेशा एक अतुल्यकालिक कार्य द्वारा उपयोग नहीं किए जाते हैं। अप्रयुक्त के रूप में एक प्रकार को चिह्नित करने के लिए, बस टाइप करें शून्य का उपयोग करें:

 private class MyTask extends AsyncTask<Void, Void, Void> { ... }

आप आगे बता सकते हैं: http://developer.android.com/reference/android/os/AsyncTask.html

या आप शंकर-गणेश के ब्लॉग को संदर्भित करके AsyncTask की भूमिका को स्पष्ट कर सकते हैं

अच्छी तरह से एक विशिष्ट AsyncTask वर्ग की संरचना इस प्रकार है:

private class MyTask extends AsyncTask<X, Y, Z>

    protected void onPreExecute(){

    }

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

    protected Z doInBackground(X...x){

    }

AsyncTask क्लास में सबसे महत्वपूर्ण तरीका। आपको यहां वह सारी सामग्री रखनी होगी जो आप पृष्ठभूमि में करना चाहते हैं, मुख्य एक से अलग धागे में। यहां हमारे पास "X" प्रकार की वस्तुओं का एक इनपुट मान है (क्या आप हेडर में देखते हैं? हमारे पास "... AsyncTask का विस्तार है" ये इनपुट मापदंडों के प्रकार हैं) और प्रकार से एक वस्तु लौटाते हैं "Z"।

   protected void onProgressUpdate(Y y){

   }

इस विधि को विधि publishProgress (y) का उपयोग करके कहा जाता है और इसका उपयोग आमतौर पर तब किया जाता है जब आप किसी प्रगति या सूचना को मुख्य स्क्रीन में दिखाना चाहते हैं, जैसे कि प्रगति बार जो आप पृष्ठभूमि में कर रहे हैं, प्रगति दिखाती है।

  protected void onPostExecute(Z z){

  }

इस विधि को पृष्ठभूमि में ऑपरेशन के बाद कहा जाता है। एक इनपुट पैरामीटर के रूप में आपको doInBackground विधि का आउटपुट पैरामीटर प्राप्त होगा।

X, Y और Z प्रकार के बारे में क्या?

जैसा कि आप उपरोक्त संरचना से घटा सकते हैं:

 X  The type of the input variables value you want to set to the background process. This can be an array of objects.

 Y  The type of the objects you are going to enter in the onProgressUpdate method.

 Z  The type of the result from the operations you have done in the background process.

हम बाहर के वर्ग से इस कार्य को कैसे कहते हैं? बस निम्नलिखित दो पंक्तियों के साथ:

MyTask myTask = new MyTask();

myTask.execute(x);

जहाँ X, X प्रकार का इनपुट पैरामीटर है।

एक बार जब हमारा कार्य चल जाता है, तो हम "बाहर" से इसकी स्थिति का पता लगा सकते हैं। "GetStatus ()" विधि का उपयोग करना।

 myTask.getStatus();

और हम निम्नलिखित स्थिति प्राप्त कर सकते हैं:

रनिंग - इंगित करता है कि कार्य चल रहा है।

PENDING - इंगित करता है कि कार्य अभी तक निष्पादित नहीं किया गया है।

समाप्त - इंगित करता है कि onPostExecute (Z) समाप्त हो गया है।

AsyncTask का उपयोग करने के बारे में संकेत

  1. OnPreExecute, doInBackground और onPostExecute को मैन्युअल रूप से कॉल न करें। यह स्वचालित रूप से सिस्टम द्वारा किया जाता है।

  2. आप किसी अन्य AsyncTask या थ्रेड के अंदर एक AsyncTask कॉल नहीं कर सकते। यूआई थ्रेड में विधि निष्पादित की कॉल किया जाना चाहिए।

  3. OnPostExecute को UI थ्रेड में निष्पादित किया गया है (यहां आप एक और AsyncTask कॉल कर सकते हैं!)।

  4. कार्य के इनपुट पैरामीटर ऑब्जेक्ट सरणी हो सकते हैं, इस तरह से आप जो भी वस्तुएं और प्रकार चाहते हैं, डाल सकते हैं।


20
सही स्पष्टीकरण दोस्त
Kalai.G

30
Google से बेहतर है।
दिओलर

25
+1। एसओ सदस्य, ध्यान दें। यह है कि आप कैसे समझाते हैं। हालांकि यह लंबा है, यह समझना बहुत आसान है। धन्यवाद कार्तिक।
सबबी

3
अच्छी व्याख्या, अब मैं एसिनेटस्क के बारे में बहुत स्पष्ट हूं। :) धन्यवाद कार्तिक
रीना

2
यह मेरे लिए बहुत सारी चीजों को साफ कर दिया, बहुत अच्छा जवाब!
माइकल

80

मुझे पार्टी में बहुत देर हो चुकी है लेकिन मुझे लगा कि इससे किसी की मदद हो सकती है।


7
यह दृश्य बेहद मददगार था। मैं इस तरह के और अधिक दृश्यों का उपयोग शुरू करने जा रहा हूं ताकि यह दिखाया जा सके कि कैसे कोड प्रवाह सीधा या तकनीक या पैटर्न असामान्य नहीं होने पर प्रकार और उनके संबंधित चर एक साथ बंधे हैं। मुझे उम्मीद है कि अन्य लोग ऐसा करेंगे। धन्यवाद
केंट लॉरडेन

अच्छा दृश्य, आप WeakAsyncTask के लिए भी जोड़ सकते हैं?
kAmol

1
@kAmol यकीन है, मैं के WeakAsyncTaskरूप में अच्छी तरह से के लिए एक प्रवाह बनाने की कोशिश करेंगे
mrid

4
एक दिन मैं इसे फ्रेम करूंगा और अपनी दीवार पर रखूंगा ताकि मुझे इस धागे को संदर्भ के लिए वापस नहीं रखना पड़े।
मैट रॉबर्टसन

14

इसे सरल रखें!

एक AsyncTaskपृष्ठभूमि कार्य है जो पृष्ठभूमि थ्रेड में चलता है। यह एक इनपुट लेता है , प्रोग्रेस करता है और आउटपुट देता है ।

यानी AsyncTask<Input,Progress,Output>

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

उदाहरण के लिए: यहां छवि विवरण दर्ज करें

AsyncTask का दिल!

doInBackgound()विधि एक में सबसे महत्वपूर्ण तरीका है AsyncTaskक्योंकि

  • केवल यह विधि पृष्ठभूमि थ्रेड में चलती है और UI थ्रेड में डेटा प्रकाशित करती है।
  • AsyncTaskमापदंडों के साथ इसका हस्ताक्षर बदलता है ।

तो रिश्ते को देखने देता है

यहां छवि विवरण दर्ज करें

doInBackground()और onPostExecute(), onProgressUpdate()भी संबंधित हैं

यहां छवि विवरण दर्ज करें

मुझे कोड दिखाएं
तो मैं DownloadTask के लिए कोड कैसे लिखूंगा?

DownloadTask extends AsyncTask<String,Integer,String>{

      @Override
      public void onPreExecute()
      {}

      @Override
      public String doInbackGround(String... params)
      {
               // Download code
               int downloadPerc = // calculate that
               publish(downloadPerc);

               return "Download Success";
      }

      @Override
      public void onPostExecute(String result)
      {
          super.onPostExecute(result);
      }

      @Override
      public void onProgressUpdate(Integer... params)
      {
             // show in spinner, access UI elements
      }

}

इस टास्क को आप कैसे चलाएंगे

new DownLoadTask().execute("Paradise.mp3");

1
// show in spinner, access UI elementsसिर्फ onProgressUpdate(...):) के लिए सबसे सीधी व्याख्या के नीचे हाथ था
Volkan Güven

5

निम्नलिखित लिंक देखें:

  1. http://developer.android.com/reference/android/os/AsyncTask.html
  2. http://labs.makemachine.net/2010/05/android-asynctask-example/

आप तीन से अधिक तर्कों को पारित नहीं कर सकते, यदि आप केवल 1 तर्क पारित करना चाहते हैं तो अन्य दो तर्कों के लिए शून्य का उपयोग करें।

1. private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> 


2. protected class InitTask extends AsyncTask<Context, Integer, Integer>

एक अतुल्यकालिक कार्य एक संगणना द्वारा परिभाषित किया जाता है जो एक पृष्ठभूमि थ्रेड पर चलता है और जिसका परिणाम UI थ्रेड पर प्रकाशित होता है। एक अतुल्यकालिक कार्य को 3 सामान्य प्रकारों द्वारा परिभाषित किया जाता है, जिन्हें परम, प्रगति और परिणाम, और 4 चरण, onPreExecute, doInBackground, onProgressUpdate और onPostExecute कहा जाता है।

KPBird


3
  • शॉर्ट में, AsyncTask में 3 पैरामीटर हैं

    1. DoInBackground (स्ट्रिंग ... परम) में इनपुट उपयोग के लिए पैरामीटर

    2. OnProgressUpdate (स्ट्रिंग ... स्थिति) में प्रगति के उपयोग की स्थिति दिखाने के लिए पैरामीटर

    3. OnPostExcute (स्ट्रिंग ... परिणाम) में परिणाम उपयोग के लिए पैरामीटर

    नोट: - [मापदंडों का प्रकार आपकी आवश्यकता के आधार पर भिन्न हो सकता है]

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