Подтвердить что ты не робот

Android: Как передать параметры AsyncTask onPreExecute()?

Я использую AsyncTask для операций загрузки, которые я реализовал как внутренний класс.

В onPreExecute() Я показываю диалоговое окно загрузки, которое затем снова скрываю в onPostExecute(). Но для некоторых операций по загрузке я заранее знаю, что они закончатся очень быстро, поэтому я не хочу отображать диалог загрузки.

Я хотел указать это с помощью логического параметра, который мог бы пройти до onPreExecute(), но по какой-то причине onPreExecute() не принимает никаких параметров.

Очевидным обходным решением, вероятно, будет создание поля члена в моей AsyncTask или во внешнем классе, который я должен был бы установить перед каждой операцией загрузки, но это не кажется очень изящным. Есть ли лучший способ сделать это?

4b9b3361

Ответ 1

Вы можете переопределить конструктор. Что-то вроде:

private class MyAsyncTask extends AsyncTask<Void, Void, Void> {

    public MyAsyncTask(boolean showLoading) {
        super();
        // do stuff
    }

    // doInBackground() et al.
}

Затем при вызове задачи выполните следующее:

new MyAsyncTask(true).execute(maybe_other_params);

Изменить: это более полезно, чем создание переменных-членов, поскольку упрощает вызов задачи. Сравните код с помощью:

MyAsyncTask task = new MyAsyncTask();
task.showLoading = false;
task.execute();

Ответ 2

1) Для меня самый простой способ передачи параметров в async-задачу так выглядит

// To call the async task do it like this
Boolean[] myTaskParams = { true, true, true };
myAsyncTask = new myAsyncTask ().execute(myTaskParams);

Объявите и используйте задачу async, как здесь

private class myAsyncTask extends AsyncTask<Boolean, Void, Void> {

    @Override
    protected Void doInBackground(Boolean...pParams) 
    {
        Boolean param1, param2, param3;

        //

          param1=pParams[0];    
          param2=pParams[1];
          param3=pParams[2];    
      ....
}                           

2) Передача методов async-task Во избежание кодирования инфраструктуры async-Task (thread, messagenhandler,...) несколько раз вы можете рассмотреть возможность передачи методов, которые должны выполняться в вашей async-задаче в качестве параметра. Следующий пример описывает этот подход. Кроме того, может потребоваться подкласс async-задачи для передачи параметров инициализации в конструкторе.

 /* Generic Async Task    */
interface MyGenericMethod {
    int execute(String param);
}

protected class testtask extends AsyncTask<MyGenericMethod, Void, Void>
{
    public String mParam;                           // member variable to parameterize the function
    @Override
    protected Void doInBackground(MyGenericMethod... params) {
        //  do something here
        params[0].execute("Myparameter");
        return null;
    }       
}

// to start the asynctask do something like that
public void startAsyncTask()
{
    // 
    AsyncTask<MyGenericMethod, Void, Void>  mytest = new testtask().execute(new MyGenericMethod() {
        public int execute(String param) {
            //body
            return 1;
        }
    });     
}

Ответ 3

почему, как и какие параметры передаются в Asynctask < > , см. подробнее здесь. Я думаю, что это лучшее объяснение.

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

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

Общие типы AsyncTask:

Три типа, используемые асинхронной задачей, следующие:

Парамс, тип параметров, отправленных в задачу при выполнении. Прогресс, тип единиц прогресса, опубликованных во время фоновых вычислений. Результат, тип результата фонового вычисления. Не все типы всегда используются асинхронной задачей. Чтобы отметить тип как неиспользуемый, просто используйте тип Void:

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

Далее вы можете: http://developer.android.com/reference/android/os/AsyncTask.html

Или вы можете очистить роль AsyncTask, указав блог Sankar-Ganesh

Хорошо Структура типичного класса 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 - указывает, что задача запущена.

PENDING - указывает, что задача еще не выполнена.

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

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

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

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

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

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