2012-01-11 11 views
14

Tengo una aplicación que usa AsyncTasks para hacer llamadas a un servidor REST.Cuando la aplicación se pone en segundo plano durante una ejecución de AsyncTask, ¿qué debería hacer?

Imagine que durante un período de carga (esto es, AsyncTask va al servidor REST y obtiene datos a la siguiente pantalla) el usuario presiona Inicio.

Lo que se recomienda:

  • Cancelar la AsyncTask (s) actual y reinicie cuando se reanuda la actividad

o

  • Continuar las AsyncTasks pero evitando la startActivity comprobando si la aplicación está en segundo plano (para evitar el primer plano de la nueva actividad después de enviar la aplicación al fondo). Y onResume enviar a la siguiente actividad

peor de los casos que se debe prever:

  1. La aplicación va a fondo y se mató debido a la falta de memoria
  2. El AsyncTask falla debido a tiempo de espera o otro error RESTO

Después de que ambos, el usuario vuelve a la aplicación ...

+0

depende de su requisito.
Si quiere preguntar cómo hacer alguna de las dos formas que ha mencionado, entonces es un caso diferente.
Por favor, diga si eso es lo que necesita. – akkilis

+0

No, sé cómo implementarlo. Quiero saber si de todos modos los dos son más recomendados y por qué. ¿Cuáles son los problemas y ventajas de cada uno? – neteinstein

+0

Como dije, depende de su requerimiento. 1. Se asegurará de que no se realice ninguna acción después de pausar la actividad y se asegurará de que se contrarresten algunas excepciones comunes planteadas en tales casos. 2. Requerirá un poco más de manejo en el código y mantenimiento de la variable de estado, y es más sofisticado en términos de experiencia. Pero tenga el problema de plantear excepciones o inconciencia en caso de que Android haya eliminado su actividad de la pila de actividades. En ese caso, su subproceso se cargará nuevamente a pesar de que se haya ejecutado en pasado porque la instancia anterior ha sido eliminada por Android. – akkilis

Respuesta

6

Bueno, yo ll recomiendan servicio que debe utilizar AsyncTask para hacer su trabajo. El servicio aislará su actividad del cambio de orientación o de la salida del usuario. AsycnTask se aislará de la secuencia de UI que está siendo bloqueada. Pero asegúrese de salir del Servicio cuando haya terminado con la APLICACIÓN REST.

Esto le dará lo mejor de ambos. Además, si no está utilizando DB como un caché local, puede intentarlo también. Entonces, incluso si el usuario se va, el servicio almacenará los datos obtenidos en la base de datos y, cuando el usuario regrese, puede visualizar rápidamente la pantalla.

EDITAR: Solo quiero agregar IntentService son fáciles de implementar.

Try Design Patterns for REST clients on Android by Google para una explicación más exhaustiva

0

descargan continúa al igual que la aplicación del mercado Android, pero muestra una notificación con la opción de cancelar. Puede implementar esto, utilizando un servicio para descargar.

+1

No estoy descargando una "aplicación" o algo específico como el mercado. Realmente no creo que esta sea una solución fácil de usar ... – neteinstein

+0

esto es solo un ejemplo del gran manejo que usa Android Market para descargar contenido. Si está descargando un pequeño conjunto de datos, la primera alternativa es correcta. Si está descargando un gran volumen de datos, debe imitar la aplicación del mercado Android. –

3

El uso de AsyncTasks puede ser realmente complicado durante un cambio de configuración. Por experiencia personal, recomendaría ir a la ruta IntentService/ResultReceiver en su lugar.

Ver este post para más información:

Restful API service

+0

Durante la rotación no hay problema ya que de hecho tengo una referencia a la actividad, tan pronto como se crea la nueva actividad, la reemplazo con la nueva. – neteinstein

+1

Independientemente, la ruta de IntentService sigue siendo una forma más sólida de ir – SeanPONeil

1

supongo que lo que quiere saber es qué camino es mejor desde la perspectiva del usuario. Desde mi experiencia, un usuario espera que la aplicación continúe la descarga en segundo plano, porque si presiona el inicio, normalmente quiere verificar otras aplicaciones o presionarlas involuntariamente y quiere regresar a su aplicación tan pronto como sea posible. posible. Si un usuario desea cancelar la descarga, normalmente presiona el botón Atrás o un botón específico para cancelar que está en algún lugar de la pantalla de su aplicación.Entonces, como el usuario normalmente quiere continuar usando la aplicación, el comportamiento más conveniente de su aplicación es continuar la descarga de datos y, con suerte, mostrar los datos descargados al usuario cuando regrese a su aplicación.

Desde una perspectiva técnica, no usaría un servicio. Simplemente dejaría funcionando AsyncTask. Y en el peor de los casos, cuando la aplicación muere entre medias, la aplicación entra automáticamente en la actividad de inicio cuando el usuario vuelve a la aplicación, porque la aplicación se reinicia de todos modos. En el caso de que falle la asynctask, puede verificar si los datos se han descargado con éxito y si no se muestra la actividad de inicio. Puede implementar esto fácilmente almacenando los datos descargados en una variable cuyo valor inicial es nulo. Si la variable sigue siendo nula después de la descarga, la AsyncTask falló y debe entrar en la actividad de inicio. Creo que esta es una implementación bastante robusta.

+0

Estaba buscando ambos. Gracias :-) – neteinstein

Cuestiones relacionadas