Могу ли я последовательно переключать асинхронную задачу (начиная с одной после завершения предыдущей асинтезы)

Каждый раз, когда я делаю httpRequest, экран будет заблокирован на несколько секунд во время выполнения кода. Поэтому я использовал AsyncTask, чтобы делать все мои вещи httpRequest в отдельном потоке, выставляя ProgressDialog, чтобы пользователь знал, что что-то происходит.

Недавно я столкнулся со следующей ситуацией: вход одного из моих httpRequest зависит от результата предыдущего действия httpRequest (+ parse). Я не могу просто поместить два AsyncTask последовательно, потому что Android поместит их в два потока и запустит второй, без завершения первого. И без соответствующего ввода (результат первого httpRequest) мой второй httpRequest приведет к сбою приложения.

Есть ли способ, по которому я могу вставить wait(), чтобы второй AsyncTask не запускался, пока не закончится первый?

Ответы

Ответ 1

У меня также была такая же ситуация на днях. Я решил это так: Передайте ссылку своей деятельности на конструктор класса async и выполните функцию do в фоновом режиме. Теперь в функции post execute вызовите общедоступный метод активности ur из класса async, чтобы снова выполнить задачу... или попробуйте следующее:

            if (asynclass.getStatus() == android.os.AsyncTask.Status.PENDING) {
                asynclass.execute();
            } else if (RF.getStatus() == android.os.AsyncTask.Status.FINISHED) {
                asynclass = new asyncclass();
                asynclass.execute();
            } else {
                Toast.maketoast(this, "Plz wait", 1).show();
            }

Приветствия

Ответ 2

поэтому я думаю (не уверен), вам нужно вызвать второй asyncTask для метода пост-выполнения

protected void onPostExecute(final Void unused) {
            if (this.dialog.isShowing()) {
                this.dialog.dismiss();
                     new secTask().execute();
            }}

Ответ 3

Да, вы можете. Но это возможно только в onProgressUpdate() или onPostExecute(). Попробуйте сделать это следующим образом:

private class Task1 extends AsyncTask<Void, Void, Void> {
...
...
    protected void onPostExecute(Void unused) { 
        dialog1.dismiss();
        new Task2().execute();
    }

}

Аналогично, вам нужно поместить new Task3().execute(); в метод onPostExecute() Task2 AsyncTask

Не называйте их в своем основном коде. Если да, то все они будут работать вместе:

// This is wrong
new Task1().execute();
new Task2().execute();
new Task3().execute();

Ссылка: AsyncTask

Ответ 4

Как насчет использования метода executOnExecutor:

public void runTasks() {

        AsyncTask<Void,Void,Void> aTask = myTask();
        AsyncTask<Void,Void,Integer> aTask1 = myTask1();
        AsyncTask<Void,Void,Void> aTask2 = myTask2();

        aTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
        aTask1.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
        aTask2.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);

    }

Ответ 5

Наткнулся на эту тему, ища лучшее решение, чем то, что я сейчас использую, но все равно кажется лучшим...

Что я делаю, это передать runnable в конструкторе каждой из моих задач async.

Как в post, так и в конце do в фоновом режиме, я запускаю свою следующую задачу, если у меня есть один, выполнив runnable.

 if(doOnPostExec != null)
        doOnPostExec.run();

Таким образом, я могу изменить порядок моих асинтаксов с помощью исполняемых файлов, которые я передаю, сохраняя код гибким, и, если я не пройду без запуска, они закончатся нормально. В runnables просто содержится одна строка, вызывающая следующую асинтезу.

Мне просто не нравится делать все эти runnables. Было надеяться, что что-то существовало, как в vb.net, для цепочки делегатов.

Ответ 6

Я столкнулся с этой проблемой раньше. То, что я сделал, это использовать интерфейс интерфейса обратного вызова и вызвать его метод внутри метода onPostExecute(). Таким образом вы можете вызвать другую AsyncTask из метода обратного вызова.