2012-02-10 11 views
12

Tengo una situación en la que tendré que hacer seis llamadas http a mi servidor para obtener los datos de seis elementos diferentes. Estas llamadas al servidor no se pueden combinar y deben ser así. Por ejemplo: si necesita información de presupuesto para GOOGLE, envíe una solicitud al servidor solicitando la información de presupuesto de Google. Luego, si necesita yahoo, inicia otra llamada http y así sucesivamente.Cómo administrar múltiples tareas de Async de manera eficiente en Android

Aquí está la situación:

  1. Ahora mi usuario final quiere comparar 6 empresas diferentes.
  2. Como mencioné es inevitable para mí hacer 6 llamadas http para las cuales hago uso de 6 tareas asincrónicas.
  3. Al obtener cada una de las respuestas de la tarea Async, actualizaré la UI con nuevos datos.
  4. Es una mala experiencia de interfaz de usuario si actualizo la interfaz de usuario 6 veces en un período de tiempo muy corto.
  5. Da un efecto de parpadeo a mi interfaz de usuario que no se desea.

Mi Pregunta:

  1. ¿Cómo puedo sostener-off de la actualización de la interfaz de usuario hasta que tenga todas las respuestas 6 asíncrono tarea?
  2. Entiendo que cada tarea es independiente la una de la otra. ¿Debo ejecutar un ciclo while y esperar hasta obtener todas las respuestas?
  3. ¿Hay una manera mejor de hacer esto en lugar de un ciclo while porque si alguno de la llamada no responde me quedaré esperando por siempre.

Nota: Creo que Android 1.6+ ejecuta tareas Async en paralelo.

Esto es más una pregunta de diseño y agradecería cualquier ayuda en esto.

Gracias de antemano

Respuesta

1

Encontré esta solución más adecuada para mi problema. Este enlace describe un par de formas de establecer esto. 1. ExecutorService 2. ExecutoreService y CountDownLatch

ExecutoreService and CountDownLatch

+0

Creo que este enfoque no sería apropiado para una actividad ya que el método CountDownLatch await se bloquearía hasta que se completaran todas las tareas y no se debería bloquear el hilo de UI. – AndroidGuy

+0

CountDownLatch se encuentra en la AsyncTask principal que genera tareas secundarias para realizar el trabajo real. Una vez que se completan todas las tareas secundarias, la Tarea principal consolida todos los resultados y regresa al subproceso UI – AKh

+0

¿Cómo funciona esto en Android? –

1

Hay muchas maneras en las que podría manejar esto:

  • Otra AsyncTask que agrega las respuestas de las tareas de la red.
  • Realice un sendEmptyMessageDelayed() cada, digamos, 500ms a un Handler creado por su Activity que actualiza los datos que provienen de las tareas de red y continúa haciéndolo hasta que se traten todos los resultados de la red.
  • Un subproceso que realiza la agregación.

Si fuera yo, probablemente vaya con el Handler. En resumen, haga que sus tareas de red almacenen los datos en algún almacenamiento intermedio. Envíe mensajes retrasados ​​a un controlador y, dentro del handleMessage() verifique los datos en el almacenamiento intermedio y publique los resultados actualizados. Si hay resultados pendientes, publique el mensaje demorado nuevamente.

4

Puede crear un objeto de agrupación AsyncTask que le permita falsificar una llamada http 'por lotes'.

  1. crear una colección observable de AsyncTasks, me referiré a esta colección como su piscina
  2. su actividad crea las AsyncTasks (pero no ejecutar aún) y los añade a la piscina
  3. Actividad registra como un observador del Pool
  4. Actividad dice Pool para ejecutar, Pool a su vez ejecuta en cada una de sus tareas
  5. Cuando las tareas se completan (tanto para el éxito como para el fracaso), almacenan los datos de respuesta en el Pool y Pool marca la Tarea como 'completa'
  6. Una vez que todas las tareas se marcan como completa, piscina notifica a la actividad de escucha

idea general es que la piscina para saber cuántas tareas y pendientes, y para almacenar los datos agregados de llamadas completadas. Una vez que todos hayan terminado, notifique a la actividad de observación y devuelva todos los datos.

Tendrás que averiguar cómo las AsyncTasks le dicen al Pool que han terminado. Tal vez simplemente tenga una implementación de AsyncTask que tome un Pool en su constructor para que las Tareas tengan una referencia al Pool.

1

simplemente punzante en la oscuridad aquí, pero usted tiene:

  • 1x interfaz de usuario del hilo principal
  • 6x asynchtasks fondo que tienen: 6x métodos para ejecutar en segundo plano 6x métodos para devolver datos a la interfaz de usuario (primer plano)

por qué no tener una variable de ámbito público en el hilo de interfaz de usuario digo llamados "finishedTasks", entonces el mismo método en cada uno de los hilos de retorno de datos 6x que:

  • incrementos finishedTasks

  • Si finishedTasks == 6 a continuación, ejecute 1 método público para hacer la actualización de la interfaz de usuario

entonces sería actualizar la interfaz de usuario en todos los asychtasks fondo completaron.

Cuestiones relacionadas