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.
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.