Я использую AsyncTask
для операций загрузки, которые я реализовал как внутренний класс.
В onPreExecute()
I показать диалог загрузки , который я затем скрыть снова onPostExecute()
. Но для некоторых операций загрузки я заранее знаю, что они завершатся очень быстро, поэтому я не хочу отображать диалог загрузки.
Я хотел указать это логическим параметром, которому я мог бы передать, onPreExecute()
но, по-видимому, по какой-то причине onPreExecute()
не принимает никаких параметров.
Очевидным обходным путем, вероятно, было бы создание поля-члена в моей AsyncTask или во внешнем классе, которое мне пришлось бы устанавливать перед каждой операцией загрузки, но это не кажется очень элегантным. Есть лучший способ сделать это?
источник
1) Для меня самый простой способ передачи параметров в асинхронную задачу выглядит следующим образом
Объявите и используйте задачу async, как здесь
2) Передача методов в асинхронную задачу Чтобы избежать многократного кодирования инфраструктуры асинхронной задачи (поток, обработчик сообщений, ...), вы можете рассмотреть возможность передачи методов, которые должны выполняться в вашей асинхронной задаче, в качестве параметра. Следующий пример описывает этот подход. Кроме того, вам может потребоваться создать подкласс асинхронной задачи для передачи параметров инициализации в конструктор.
источник
почему, как и какие параметры передаются в Asynctask <>, см. подробности здесь . Думаю, это лучшее объяснение.
Документация Google для Android гласит:
Асинхронная задача определяется 3 универсальными типами, называемыми Params, Progress и Result, и 4 шагами, называемыми onPreExecute, doInBackground, onProgressUpdate и onPostExecute.
Общие типы AsyncTask:
Асинхронная задача использует следующие три типа:
Params, тип параметров, отправляемых задаче при выполнении. Прогресс, тип единиц прогресса, публикуемых во время фоновых вычислений. Результат, тип результата фоновых вычислений. Не все типы всегда используются асинхронной задачей. Чтобы пометить тип как неиспользуемый, просто используйте тип Void:
Вы можете дополнительно сослаться на: http://developer.android.com/reference/android/os/AsyncTask.html
Или вы можете выяснить, какова роль AsyncTask, обратившись к блогу Санкар-Ганеша
Что ж. Структура типичного класса AsyncTask выглядит так:
Этот метод выполняется перед запуском нового потока. Здесь нет значений ввода / вывода, поэтому просто инициализируйте переменные или все, что, по вашему мнению, вам нужно сделать.
Самый важный метод в классе AsyncTask. Вы должны разместить здесь все, что хотите делать в фоновом режиме, в другом потоке, отличном от основного. Здесь у нас есть в качестве входного значения массив объектов из типа «X» (вы видите в заголовке? У нас есть «... extends AsyncTask» Это ТИПЫ входных параметров) и возвращает объект из типа «Z».
protected void onProgressUpdate (Y y) {
} Этот метод вызывается с использованием метода publishProgress (y), и он обычно используется, когда вы хотите показать какой-либо прогресс или информацию на главном экране, например, индикатор выполнения, показывающий ход операции, которую вы выполняете в фоновом режиме.
protected void onPostExecute (Z z) {
} Этот метод вызывается после выполнения фоновой операции. В качестве входного параметра вы получите выходной параметр метода doInBackground.
А как насчет типов X, Y и Z?
Как вы можете сделать вывод из приведенной выше структуры:
Как мы называем эту задачу из внешнего класса? Просто со следующими двумя строками:
Где x - входной параметр типа X.
Когда наша задача будет запущена, мы сможем узнать ее статус «извне». Использование метода «getStatus ()».
myTask.getStatus (); и мы можем получить следующий статус:
ВЫПОЛНЯЕТСЯ - указывает, что задача выполняется.
ОЖИДАНИЕ - указывает, что задача еще не выполнена.
ЗАВЕРШЕНО - указывает, что onPostExecute (Z) завершился.
Подсказки по использованию AsyncTask
Не вызывайте методы onPreExecute, doInBackground и onPostExecute вручную. Система делает это автоматически.
Вы не можете вызвать AsyncTask внутри другой AsyncTask или Thread. Вызов метода execute должен выполняться в потоке пользовательского интерфейса.
Метод onPostExecute выполняется в потоке пользовательского интерфейса (здесь вы можете вызвать другую AsyncTask!).
Входными параметрами задачи может быть массив объектов, таким образом вы можете поместить любые объекты и типы, которые захотите.
источник
Вы можете передать параметр в конструкторе задачи или при вызове execute:
Первый параметр (Object) передается в doInBackground. Третий параметр (MyTaskResult) возвращается doInBackground. Вы можете изменить их на нужный вам тип. Три точки означают, что ноль или более объектов (или их массив) могут быть переданы в качестве аргумента (ов).
источник