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


157

Я не понимаю, что я должен здесь изложить и где эти аргументы заканчиваются? Что именно я должен поставить, и куда именно он пойдет? Нужно ли включать все 3 или можно включить 1,2,20?

Ответы:


496

Документация Google по Android говорит, что:

Асинхронная задача определяется 3 общими типами, называемыми Params, Progress и Result, и 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» (Вы видите в заголовке? У нас есть «... extends 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();

и мы можем получить следующий статус:

RUNNING - указывает, что задача выполняется.

В ОЖИДАНИИ - указывает, что задача еще не выполнена.

ЗАВЕРШЕНО - указывает, что onPostExecute (Z) завершено.

Советы по использованию AsyncTask

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

  2. Вы не можете вызвать AsyncTask внутри другого AsyncTask или Thread. Вызов метода execute должен быть выполнен в потоке пользовательского интерфейса.

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

  4. Входные параметры задачи могут быть массивом объектов, таким образом, вы можете поместить любые объекты и типы, которые вы хотите.


20
Прекрасное объяснение чувак
Kalai.G

30
Лучше, чем Google.
Диолор

25
+1. Члены ТАК, обратите внимание Это то, как вы объясняете. Хотя это долго, это очень легко понять. Спасибо, Картик.
Subby

3
Хорошее объяснение, теперь я очень хорошо разбираюсь в Asyntask. :) Спасибо Kartik
Рина

2
Это многое прояснило для меня, отличный ответ!
Майкл

80

Я опоздал на вечеринку, но подумал, что это может кому-то помочь.


7
Это изображение было чрезвычайно полезным. Я собираюсь начать использовать больше визуальных элементов, подобных этому, чтобы показать, как типы и связанные с ними переменные связаны друг с другом, когда поток кода не является простым или методика или шаблон необычны. Я надеюсь, что другие сделают больше этого. Спасибо
Кент Лауридсен

Хорошие визуальные эффекты, не могли бы вы добавить также WeakAsyncTask?
Камоль

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 аргумент, используйте void для двух других аргументов.

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


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

Асинхронная задача определяется вычислением, которое выполняется в фоновом потоке и результаты которого публикуются в потоке пользовательского интерфейса. Асинхронная задача определяется 3 общими типами, называемыми Params, Progress и Result, и 4 шагами, называемыми onPreExecute, doInBackground, onProgressUpdate и onPostExecute.

KPBird


3
  • Короче говоря, в AsyncTask есть 3 параметра

    1. параметры для использования ввода в DoInBackground (String ... params)

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

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

    Примечание: - [Тип параметров может варьироваться в зависимости от ваших требований]

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.