studio rotación rotacion reinicie que pantalla orientacion movil manejando giratoria girar fijar evitar detectar configchanges como cambio activity android android-asynctask

android - rotación - Manejar cambios de orientación de la pantalla cuando hay AsyncTasks en ejecución



pantalla giratoria (3)

Echa un vistazo a la biblioteca BetterAsyncTask droid-fu. Está destinado a manejar este caso exacto.

http://brainflush.wordpress.com/2009/11/16/introducing-droid-fu-for-android-betteractivity-betterservice-and-betterasynctask/

He estado molestado por esto por un tiempo. ¿Cómo manejo adecuadamente los cambios de orientación de la pantalla mientras tengo un Thread / AsyncTask separado en ejecución? Actualmente tengo

android:configChanges="orientation|keyboard|keyboardHidden"

en mi AndroidManifest.xml , pero eso no se recomienda :

Nota: el uso de este atributo debe evitarse y usarse solo como último recurso. Lea Handling Runtime Changes para obtener más información sobre cómo manejar correctamente un reinicio debido a un cambio de configuración.

Además, en el emulador 2.3 , funciona cuando se cambia a landscape , pero el cambio a portrait falla.

Ahora, la razón por la que uso configChanges es porque cuando el usuario cambia de orientación, es posible que tenga una AsyncTask ejecutándose, haciendo algo de tráfico de red, y no quiero que se detenga.

¿Hay alguna otra manera de hacer esto, o hay una manera de arreglar 2.3 para volver al retrato?

Sé sobre onRetainNonConfigurationInstance , pero no estoy seguro de que sea una buena idea "guardar" la instancia de AsyncTask , principalmente porque la clase que extiende AsyncTask no es estática (por lo que está vinculada a la Activity ), y necesita be, porque en onPostExecute() llama a métodos desde la instancia de Activity .


Tuve un problema similar al tuyo y lo AsyncTask implementando AsyncTask como parte de una clase que hereda de la clase Application . Una clase de Application está disponible durante toda la vida útil de la aplicación, por lo que no tiene que preocuparse por que su AsyncTask se interrumpa a menos que se AsyncTask la aplicación completa.

Para recibir una notificación cuando la tarea haya finalizado, la Activity debe implementar una interfaz que utiliza para registrarse en la clase de Application .

Cuando se destruye su aplicación debido a la rotación de la pantalla, puede cancelar el registro de su Activity de la clase de la Application y volver a registrarla cuando se vuelva a crear. Si la tarea finaliza entre la destrucción y la recreación, el resultado de la operación se puede almacenar en la clase de Application mientras tanto, la Activity puede verificar si la tarea aún se está ejecutando o si el resultado ya está disponible cuando se vuelve a crear.

Otra ventaja es que tiene acceso directo al contexto de las aplicaciones porque la clase de Application es una subclase de la clase de Context .


Ya hice una pregunta similar here .

Básicamente, hay un example de cómo pausar / reanudar una AsynTask en la rotación del dispositivo. Sin embargo, todavía no se ajusta a todos los casos (a veces no es posible suspender la acción de forma segura, como la creación de un nuevo usuario en un servidor remoto). Para esos casos "inseguros" que necesitas para codificar algo, llamaría un "marco" complicado. Verá CommonsWare le da a github enlaces a uno.