2011-04-26 15 views
7

Tengo una actividad que ejecuta una simple tarea AsyncTask. Para mantener el AsyncTask ejecutándose durante rotaciones de pantalla, estoy usando onRetaingNonConfigurationInstance() para pasar el AsyncTask a la nueva Actividad como se recomienda en una de las respuestas del hilo How to handle an AsyncTask during Screen Rotation? Luego actualizo un puntero a la Actividad en el AsyncTask para asegurarme de que aún pueda actualice el diálogo de progreso desde OnProgressUpdate().Mantener AsyncTask durante la rotación pero no en la eliminación de actividad

Mi problema es que al usar este método no puedo detectar si la Actividad solo está rotada (en este caso quiero continuar ejecutando AsyncTask) o si la Actividad está oculta por el botón de Inicio en cuyo caso me gustaría para detener el AsyncTask. Sin embargo, puedo detectar el uso del botón Atrás porque en este caso el isFinishing() de la Actividad devuelve verdadero;

¿Hay algún mecanismo que pueda usar para diferenciar la rotación del uso del botón de inicio?

Respuesta

2

Si presiona el botón de inicio, no se debe invocar el método en la opción de configuración de RetaingNonConfigurationInstance(). De modo que puede usar alguna variable booleana que establezca en RetaingNonConfigurationInstance() en true. En onDestroy(), puede verificar la variable y detener el AsyncTask cuando aún esté en false.

actualización

pensé en mi solución de nuevo y después de buscar creo que es un error, ya que OnDestroy() no se llama si se pulsa el botón de inicio. Y onStop() se llama before onRetaingNonConfigurationInstance(), por lo que detener AsyncTask lo habrá antes, ya que no se sabe si se trata de un cambio de configuración o no.

Un mal ejemplo sería llamar a un método en usted AsyncTask en oStop() que inicializa algún tipo de autodestrucción en el AsynTask que luego puede detener nuevamente en onstatingNonConfigurationInstance() si se trata de un cambio de configuración. Como dije, no es muy elegante.

+1

Gracias por la propuesta, pero voy a esperar un poco para ver si alguien ofrece una solución más "elegante" antes de elegir esto como mi respuesta aceptada. – jmbouffard

+0

@jmbouffard - Puede que estés analizando esto. Ya está usando onRetainingNonConfiguraitonInstance() para manejar rotaciones. Asegúrese de cancelar la AsyncTask en onDestory(). Eso debería ser todo lo que se necesita. SI el usuario presiona la tecla de inicio y el teléfono no cancela su actividad (y llama a Destroy()) la actividad de recarga la tendrá cargada y lista para el usuario. – eyespyus

+1

No funcionaría para mí porque quiero que mi AsyncTask continúe siempre que ocurra la rotación de la pantalla y se invoque onDestroy() en cada rotación. Quiero pasar mi AsyncTask activa a la nueva actividad que se crea después de la rotación. – jmbouffard

0

Here Encontré una solución muy elegante para usar AsyncTasks con ProgressDialogs. No puedo decir ahora si le sirve a su caso. Intentalo.

0

hay que añadir esto a la declaración de la actividad en el manifiesto:

androide: configChanges = "keyboardHidden | Orientación | ScreenSize"

que debe mantener toda su actividad sin cambios al girar.

espero que ayude

Cuestiones relacionadas