Какие аргументы передаются в AsyncTask? - PullRequest
152 голосов
/ 19 мая 2011

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

Ответы [ 5 ]

473 голосов
/ 19 мая 2011

Документация 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 - Указывает, что задача выполняется.

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

FINISHED - Указывает, что onPostExecute (Z) завершено.

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

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

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

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

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

64 голосов
/ 30 ноября 2017

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

8 голосов
/ 24 января 2019

Будьте проще!

AsyncTask - это фоновая задача, которая запускается в фоновом потоке.Он принимает Input , выполняет Progress и дает Output .

т.е. AsyncTask<Input,Progress,Output>.

По моему мнению, основной источник путаницы возникает, когда мы пытаемся запомнить параметры в AsyncTask.
Ключ Не запоминайте .
Если вы можете визуализировать, что ваша задача действительно должна делать, тогда написание AsyncTask с правильной сигнатурой будет очень просто.
Просто выясните, чтоВаш Вход , Прогресс и Выход есть, и вам будет хорошо идти.

Например: enter image description here

Сердце AsyncTask!

doInBackgound() метод является наиболее важным методомв AsyncTask, потому что

  • Только этот метод выполняется в фоновом потоке и публикует данные в потоке пользовательского интерфейса.
  • Его сигнатура изменяется с параметрами AsyncTask.

Итак, давайте посмотрим на соотношение

enter image description here

doInBackground() и onPostExecute(), onProgressUpdate() также связаны

enter image description here

Покажите мне код
Так как я буду писатькод для 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");
5 голосов
/ 19 мая 2011

См. Следующие ссылки:

  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 голосов
/ 23 февраля 2018
  • Короче говоря, в AsyncTask есть 3 параметра

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...