Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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) Передача методов async-taskВо избежание кодирования инфраструктуры Async-Cass (Thread, Messagenhandler, ...) несколько раз вы можете рассмотреть возможность передавать методы, которые должны быть выполнены в вашей асинхронной задаче в качестве параметра. Следующий пример описывает этот подход. Кроме того, у вас может быть необходимость подкласса 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;
        }
    });     
}

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

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

Асинхронная задача определяется 3 родовыми типами, называемыми словами, прогрессом и результатом, а 4 шагов, называемых onreexecute, doinbackground, onpressuppdate и onpostexecute.

Общие типы асинктраксов:

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

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

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

Вы можете в дальнейшем обратиться: http://developer.android.com/reference/android/os/asyncyctask.html.

Или вы можете очистить, какова роль асинктаки, ссылаясь в блоге Санкера-Ганеша

Ну, структура типичной асинктюзского класса идет как:

private class MyTask extends AsyncTask<X, Y, Z>

    protected void onPreExecute(){ 

    } 

Этот метод выполнен перед запуском нового потока. Нет значения ввода / вывода, поэтому инициализируйте переменные или что вы думаете, что вам нужно сделать.

protected Z doInBackground(X...x){

}

Самый важный метод в классе Asyncctask. Вы должны разместить здесь все материалы, которые вы хотите сделать на заднем плане, в другой нити от основного. Здесь мы имеем в качестве входного значения на массиве объектов из типа «X» (вы видите в заголовке? У нас есть «... продлевает Asynctask» Это типы входных параметров) и возвращает объект из типа "Z".

Охраняемая пустота ONPROGRESSUPDATE (Y Y) {

} Этот метод называется с использованием метода publishProgress (y), и он обычно используется, когда вы хотите показать любые прогрессы или информацию на главном экране, например, стержень выполнения, показывающий прогресс операции, которую вы делаете на заднем плане.

защищенная пустота 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 (); И мы можем получить следующий статус:

Бег - указывает, что задача работает.

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

Закончено - указывает на то, что OnPostexecute (z) закончил.

Намеки на использование асинктюз

Не называйте методы onreexecute, Doinbackground и OnPostexecute вручную. Это автоматически делается системой.

Вы не можете назвать асинктюзну внутри другой асинктюзской или нити. Звонок выполнения метода должен быть выполнен в потоке UI.

Способ OnPostexecute выполняется в потоке UI (здесь вы можете позвонить другой Asynctask!).

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

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

AsyncTask<Object, Void, MyTaskResult>

Первый параметр (объект) передается в 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);

        }
    }

}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top