¿Puedo encadenar la tarea asincrónica secuencialmente (comenzando una después de que se complete la asynctask anterior)

Cada vez que hago una httpRequest , la pantalla aparecerá bloqueada durante unos segundos mientras el código se está ejecutando. Por lo tanto, utilicé AsyncTask para hacer todo mi material de httpRequest en un hilo por separado mientras httpRequest un ProgressDialog para que el usuario sepa que algo está sucediendo.

Recientemente me encontré con la siguiente situación: la entrada de una de mis httpRequest depende del resultado de una httpRequest previa httpRequest (+ analizar). No puedo simplemente poner las dos AsyncTask secuencialmente porque Android las colocará en dos hilos y comenzará la segunda sin que se termine la primera. Y sin una entrada apropiada (el resultado de la primera httpRequest ), mi segunda httpRequest bloqueará la aplicación.

¿Hay alguna manera de ponerlo en wait() para forzar al segundo AsyncTask no comenzar hasta que termine el primero?

También tuve la misma situación el otro día. Lo había resuelto de esta manera: pasa la referencia de tu actividad al constructor de la clase async y ejecuta el do en función de fondo. Ahora, en la función de ejecución posterior, llama a un método público de tu actividad de la clase async para ejecutar la tarea de nuevo … o prueba esto:

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

Aclamaciones

entonces creo (no estoy seguro), necesitas llamar a second asyncTask en el método de post ejecución

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

Sí tu puedes. Pero solo es posible en onProgressUpdate() o onPostExecute() . Intenta hacerlo así:

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

Del mismo modo, deberá colocar una new Task3().execute(); en el método onPostExecute() de AsyncTask de AsyncTask

No los llames así en tu código principal. Si lo haces, todos se ejecutarán juntos:

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

Referencia: AsyncTask

¿Qué le executOnExecutor usar el método executOnExecutor ?

 public void runTasks() { AsyncTask aTask = myTask(); AsyncTask aTask1 = myTask1(); AsyncTask aTask2 = myTask2(); aTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); aTask1.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); aTask2.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); } 

Tropecé con este hilo buscando una solución mejor que la que uso actualmente, pero aún parece la mejor …

Lo que hago es aprobar un ejecutable en el constructor de cada una de mis tareas asíncronas.

Ya sea en la publicación posterior o al final del do en segundo plano, inicio mi próxima tarea, si tengo una ejecutando el ejecutable.

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

De esta forma puedo cambiar el orden de mis tareas asíncronas por los elementos ejecutables que paso manteniendo el código flexible, y si no paso ejecutable, se completan normalmente. Los ejecutables solo contienen una línea que llama a la siguiente asynctask.

Simplemente no me gusta hacer todos esos ejecutables. Esperaba que existiera algo como en vb.net para encadenar delegates.

Me encontré con este problema antes. Lo que hice fue utilizar una clase de interfaz de callback y llamar a su método dentro del método onPostExecute (). De esta forma puede llamar a otra AsyncTask desde el método de callback.