Android: Как я могу передать параметры в OnPreExecute () AsyncTask? - PullRequest
111 голосов
/ 19 июня 2010

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

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

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

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

Ответы [ 4 ]

222 голосов
/ 20 июня 2010

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

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);

Edit: это более полезно, чем создание членапеременные, потому что это упрощает вызов задачи.Сравните код выше с:

MyAsyncTask task = new MyAsyncTask();
task.showLoading = false;
task.execute();
59 голосов
/ 19 апреля 2013

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

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

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

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) Передача методов асинхронной задаче Чтобы избежать многократного кодирования инфраструктуры асинхронной задачи (thread, messagenhandler, ...), вы можете передать в качестве параметра методы, которые должны выполняться в вашей асинхронной задаче. Следующий пример описывает этот подход. Кроме того, вам может потребоваться создать подкласс асинхронной задачи для передачи параметров инициализации в конструкторе.

 /* 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;
        }
    });     
}
10 голосов
/ 30 сентября 2015

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

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

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

Общие типы AsyncTask:

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

Params, тип параметров, отправляемых взадание при исполнении.Прогресс, тип единиц прогресса, опубликованных во время фоновых вычислений.Result - тип результата фонового вычисления.Не все типы всегда используются асинхронной задачей.Чтобы пометить тип как неиспользуемый, просто используйте тип 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 - указывает, что задача выполняется.

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

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

Подсказки по использованию AsyncTask

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

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

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

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

2 голосов
/ 28 декабря 2017

Вы можете передать параметр в конструкторе задач или при вызове execute:

AsyncTask<Object, Void, MyTaskResult>

Первый параметр (Object) передается в doInBackground. Третий параметр (MyTaskResult) возвращается doInBackground. Вы можете изменить их на типы, которые вы хотите. Три точки означают, что в качестве аргумента (ов) могут быть переданы ноль или более объектов (или их массив).

public class MyActivity extends AppCompatActivity {

    TextView textView1;
    TextView textView2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);    
        textView1 = (TextView) findViewById(R.id.textView1);
        textView2 = (TextView) findViewById(R.id.textView2);

        String input1 = "test";
        boolean input2 = true;
        int input3 = 100;
        long input4 = 100000000;

        new MyTask(input3, input4).execute(input1, input2);
    }

    private class MyTaskResult {
        String text1;
        String text2;
    }

    private class MyTask extends AsyncTask<Object, Void, MyTaskResult> {
        private String val1;
        private boolean val2;
        private int val3;
        private long val4;


        public MyTask(int in3, long in4) {
            this.val3 = in3;
            this.val4 = in4;

            // Do something ...
        }

        protected void onPreExecute() {
            // Do something ...
        }

        @Override
        protected MyTaskResult doInBackground(Object... params) {
            MyTaskResult res = new MyTaskResult();
            val1 = (String) params[0];
            val2 = (boolean) params[1];

            //Do some lengthy operation    
            res.text1 = RunProc1(val1);
            res.text2 = RunProc2(val2);

            return res;
        }

        @Override
        protected void onPostExecute(MyTaskResult res) {
            textView1.setText(res.text1);
            textView2.setText(res.text2);

        }
    }

}
...