Які аргументи передаються в AsyncTask <arg1, arg2, arg3>?


157

Я не розумію, що я маю тут вкласти і де ці аргументи закінчуються? Що саме потрібно поставити, і куди саме воно піде? Чи потрібно мені включати всі 3 чи можу включати 1,2,20?

Відповіді:


496

Документація Google для Android говорить:

Асинхронна задача визначається трьома загальними типами, що називаються Парамами, Прогресом та Результатом, та 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.

Не всі типи завжди використовуються асинхронним завданням. Щоб позначити тип як невикористаний, просто використовуйте тип Void:

 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" (Ви бачите в заголовку? У нас є "... extens AsyncTask" (це типи вхідних параметрів)) і повертає об'єкт від типу "Z".

   protected void onProgressUpdate(Y y){

   }

Цей метод називається за допомогою методу публікуватиProgress (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();

і ми можемо отримати такий статус:

РУНІНГ - вказує на те, що завдання виконується.

ОЧАКУВАННЯ - означає, що завдання ще не виконано.

ЗАВЕРШЕНО - Вказує на те, що onPostExecute (Z) закінчено.

Підказки щодо використання AsyncTask

  1. Не викликайте методи onPreExecute, doInBackground та onPostExecute вручну. Це автоматично робиться системою.

  2. Ви не можете викликати AsyncTask всередині іншого AsyncTask або Thread. Виклик виконавця методу повинен здійснюватися в потоці інтерфейсу користувача.

  3. Метод onPostExecute виконується в потоці користувальницького інтерфейсу (тут ви можете викликати інший AsyncTask!).

  4. Вхідними параметрами завдання може бути масив Object, таким чином ви можете розміщувати будь-які об'єкти та типи, які ви хочете.


20
Ідеальне пояснення чувак
Kalai.G

30
Краще, ніж Google.
Діолор

25
+1. Члени членів, прийміть до відома. ЦЕ так ви пояснюєте. Хоча це тривалий, зрозуміти це надзвичайно просто. Дякую Картіку.
Subby

3
Гарне пояснення, зараз я дуже чітко розумію Асинтаск. :) Дякую Kartik
Reena

2
Це очистило для мене багато речей, чудова відповідь!
Майкл

80

Я запізнився на вечірку, але подумав, що це може комусь допомогти.


7
Це наочне зображення було надзвичайно корисним. Я почну використовувати більше подібних зображень, щоб показати, як типи та пов'язані з ними змінні пов'язані між собою, коли потік коду не є простим або техніка чи візерунок нечасті. Я сподіваюся, що інші зроблять більше цього. Спасибі
Кент Лаурідсен

Приємні візуальні ви можете додати ще й для WeakAsyncTask?
kAmol

1
@kAmol звичайно, я буду намагатися зробити потік для WeakAsyncTaskа
mrid

4
Одного разу я сформулюю це і покладу його на свою стіну, щоб мені не доводилося повертатися до цієї теми для ознайомлення.
Метт Робертсон

14

Не ускладнювати!

AsyncTaskФонова завдання , яка виконується в фоновому потоці. Він бере вхід , виконує прогрес і дає вихід .

тобто AsyncTask<Input,Progress,Output>.

На мій погляд, основне джерело плутанини виникає, коли ми намагаємось запам'ятати параметри в AsyncTask.
Ключ: Не запам'ятовувати .
Якщо ви можете уявити, що вам справді потрібно зробити, то написання AsyncTaskправильного підпису буде шматочком пирога.
Просто з’ясуйте, які ваші вкладення , прогрес і результат , і вам буде добре.

Наприклад: введіть тут опис зображення

Серце AsyncTask!

doInBackgound()метод є найважливішим методом у AsyncTaskтому, що

  • Тільки цей метод працює у фоновому потоці та публікує дані в потоці інтерфейсу користувача.
  • Її підпис змінюється з 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>

Асинхронна задача визначається обчисленням, яке працює на фоновому потоці і результат якого публікується на потоці інтерфейсу користувача. Асинхронна задача визначається трьома загальними типами, що називаються Парамами, Прогресом та Результатом, та 4 кроками, що називаються onPreExecute, doInBackground, onProgressUpdate та onPostExecute.

KPBird


3
  • Якщо коротко, в AsyncTask є 3 параметри

    1. параметри для використання вводу в DoInBackground (Параметри рядка ...)

    2. параметри для показу стану використання прогресу в OnProgressUpdate (String ... status)

    3. параметри для використання результату в OnPostExcute (String ... результат)

    Примітка: - [Тип параметрів може змінюватися залежно від вашої потреби]

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.