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.

¿Cómo podría hacer esto?

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.

  • Llamada a Android Async Tarea en una actividad
  • Servicio v / s AsyncTask
  • OnPostExecute () de AsyncTask nunca se llama en AndroidTestCase
  • Obtener No puede crear el controlador dentro de hilo que no ha llamado Looper.prepare () con código que funcionó para Android 4
  • Descargar archivos grandes (> 100mb) en Honeycomb en AsyncTask ralentiza la interfaz de usuario, posiblemente debido a GC?
  • ¿Método óptimo para posponer onEvent?
  • Obtener contexto en AsyncTask
  • Handlers vs llamadas asincrónicas en Android
  • Android runOnUiThread / AsyncTask no puede resolver CalledFromWrongThreadException
  • AndroidRX - ejecuta el método en segundo plano
  • Android: TimerTask programado para la repetición de ser despedido sólo una vez
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.