2012-03-02 13 views
5

En el pasado, los cambios de orientación y AsyncTask (y otras tareas de fondo de larga ejecución) no se han reproducido bien entre sí. Siempre ha existido el problema de saber qué tareas (o subprocesos) aún se están ejecutando en la actividad recién creada (a partir de un cambio de orientación), y qué hacer cuando una tarea finaliza mientras una Actividad no está adjunta.Android, AsyncTask, procesos de larga ejecución y cambios de orientación

Incluso con Fragments y el LoaderManager, esto todavía parece ser un problema para mí.

¿Cuál es la forma preferida estos días para administrar tareas de ejecución larga arbitraria y cambios de orientación? Para saber qué tareas se están ejecutando en la actividad recién creada. Para asegurarse de que una tarea no intente entregar su información cuando una actividad no está adjunta.

Gracias

+2

Sugiero que reescriba su pregunta, reemplazando la palabra "proceso" en los lugares donde en realidad no quiere decir "proceso" sino que significa algo más. Un proceso de sistema operativo tiene una definición muy específica, una que hace que su pregunta tenga poco sentido (por ejemplo, los procesos no entregan información, las actividades no crean procesos). – CommonsWare

Respuesta

4

En mi programa acabo de poner

android:configChanges="orientation|keyboardHidden|keyboard" 

en mis actividades en el manifiesto y hacerse con él. Después de 1 año, tuve 0 problemas.

+0

¿Cómo manejas los cambios de configuración tú mismo? – synic

+0

He encontrado que tener eso en el manifiesto hace que la actividad no se vuelva a crear, resolviendo así todos tus problemas. Iba a tratar de manejarlo yo mismo, pero me pareció innecesario en la práctica. Funciona como lo esperarías o querrías. – Pyrodante

+0

Wow. Siempre me alejé de esto porque parecía más complicado de lo que quería. Tienes razón, parece funcionar como yo quiero. – synic

-1

Es lo mismo que siempre ha sido: utiliza un servicio. Emite eventos de tu servicio y captúralos en tu actividad (o en alguna capa intermedia). Su actividad puede entonces elegir qué hacer con esos eventos en función de su estado.

Esta es una pregunta bastante amplia.

+1

No creo que este sea el problema que los Servicios deben resolver. Parece que si su aplicación no tiene tareas que sean independientes de su ciclo de vida de la actividad, un servicio sería simplemente una pérdida de recursos. – synic

0

Como sugiere otra publicación, puede usar android: configChanges = xxx.

PERO, esto no siempre es deseado. Android está diseñado para eliminar la actividad en el cambio de configuración y crear una nueva, y puede beneficiarse de esto en alguna situación, proporcionando un diseño de pantalla alternativo. Esto tiene sentido, por ejemplo, en la aplicación de varios paneles, donde la orientación horizontal muestra diferentes vistas que la orientación vertical.

Así que para volver a su pregunta: No leí sobre la forma preferida de manejar operaciones de larga ejecución, pero a partir de experiencias propias sugiero almacenar dicha tarea en estado de actividad persistente (guardada/restaurada en onRetainNonConfigurationInstance/onCreate) o usando Fragmentos persistentes.

Si su actividad detecta que alguna tarea ya se está ejecutando, puede darle la oportunidad de recrear el diálogo para mostrar su progreso.

Y tenga en cuenta: el cambio de orientación no es el único que puede hacer que su actividad sea recreada. Esté preparado para el cambio de idioma, el acoplamiento y otras posibilidades :) Pero aún así, el cambio de orientación es el más común.

+0

Fragmentos persistentes todavía tiene la posibilidad de intentar entregar resultados cuando la actividad no está adjunta. onRetainNonConfigurationInstance no puede almacenar, por ejemplo, una conexión de red activa. El problema aquí no es almacenar el estado para el cambio de configuración, es asegurarse de que los datos no se entreguen cuando una actividad no está conectada, o asegurarse de que no intente entregarlo a una actividad muerta. – synic

Cuestiones relacionadas