Cómo evitar la rotación hasta que AsyncTask no se termina
He notado que si intento girar el dispositivo mientras que un AsyncTask
está funcionando la aplicación se bloquea. Esto parece causado por el hecho de que la Activity
es destruida y recreada en la rotación.
Para evitar esto quiero capturar el evento de rotación y ejecutarlo sólo si no hay AsyncTask
activa s … si hay AsyncTask
s que están activos, la aplicación debe pausar la rotación y ejecutarla cuando se completan.
- Android AsyncTask ejemplo y explicación
- DoInBackground tarda mucho en comenzar
- Java / Android cómo iniciar un AsyncTask después de 3 segundos de retraso?
- AsyncTask's doInBackground inicia su ejecución demasiado tarde después de AsyncTask :: execute se llama
- Android Honeycomb: Fragmento no puede iniciar AsyncTask?
¿Cómo podría hacer esto?
- ¿Se está destruyendo la actividad porque la orientación ha cambiado o porque la aplicación se está cerrando?
- Android AsyncTask detección si se realiza
- Modificar vistas en AsyncTask doInBackground () no (siempre) arrojar excepción
- onPostExecute () no funciona en volver a ejecutar de asyncTask llamado de una actividad
- ¿Cuáles son las ventajas / desventajas de pasar argumentos al constructor AsyncTask?
- Asíntate un comportamiento extraño
- ¿Cancelar la carga de Google Drive posible?
- Acceso a GoogleMap desde fuera del hilo de la interfaz de usuario en Android
No es posible pausar la rotación de la pantalla. Sólo puede detenerlo completamente usando configChanges en su entrada de manifiesto de actividad (pero eso es mala práctica). Lo que debe hacer es poner su tarea asíncrona en fragmentos retenidos. Hasta hace poco podías usar Activity.getLastNonConfigurationInstance y Activity.onRetainNonConfigurationInstance para mantener la referencia a AsyncTask entre Actividad que se estaba destruyendo y recreando pero ahora está obsoleta. Pero todavía puede usarlo.
lea aquí para obtener más información: http://developer.android.com/reference/android/app/Activity.html#onRetainNonConfigurationInstance ()
También:
si intento girar el dispositivo durante AsincTask la aplicación se bloquea
esto realmente no debería suceder, es posible que mantenga una referencia a su actividad en AsyncTask y la use después de que se destruya. Esto se llama pérdida de referencia. Para evitarlo, mantenga una referencia a su Actividad en WeakReference, también si su AsyncTask es una clase interna, entonces establézcala. Si es posible, destruya su asynctask en Activity.onDestroy – al cancelarlo, en la comprobación de tareas asíncrona si se cancela y deja de procesar. Si lo usa para descargar cosas, entonces considere el fragmento retenido o IntentService.
Vuelva a diseñar su aplicación y utilice un fragmento con setRetainInstance(true)
. Ponga su AsyncTask dentro del fragmento. Esto es lo correcto en este caso.
No hagas eso. En su lugar, manejar todo correctamente a través de cambios de orientación.
Un trabajador Fragment
con un AsyncTask
en él es una buena solución. El fragmento se queda a través de los cambios de orientación para que la tarea no se interrumpa y siempre se reporta a la Activity
correcta a través de getActivity()
del fragmento.
Este tutorial muestra exactamente cómo hacerlo http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html
Puede comprobar si su AsyncTask
está ejecutando y, si es así, evitar que la aplicación gire. Algo como esto haría el truco:
if (myAsyncTask.getStatus() == AsyncTask.Status.RUNNING) { if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } else { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } }
El código anterior verificará si AsyncTask
está en ejecución y, si es así, obtenga la orientación de pantalla actual y bloqueelo. Podría agregar una comprobación similar para desbloquear la rotación si el AsyncTask
ya no se está ejecutando.
- Android Geocoder obtener nombre corto del área de administración
- Detener el registro de Android Beacon Library