Descartar cuadro de diálogo después de cambiar la orientación de pantalla

1) Inicie una tarea de fondo (a través de AsyncTask)

new FindJourneyTask().execute(); // FindJourneyTask extends AsyncTask 

2) Todavía en el hilo principal (justo antes de que se lance el nuevo hilo) creo un diálogo con showDialog (dialogId)

 // this method is in FindJourneyTask protected void onPreExecute() { showDialog(DIALOG_FINDING_JOURNEY); } 

3) Cambia la orientación de la pantalla y se recrea la Actividad

4) ¿Cómo puedo ahora descartar el diálogo de FindJourneyTask? Llamar dismissDialog (dialogId) no hace nada.

 // this method is in FindJourneyTask protected void onPostExecute(FindJourneyResult result) { dismissDialog(DIALOG_FINDING_JOURNEY); // does nothing } 

Este es un problema común, y no hay soluciones realmente buenas. El problema es que en el cambio de orientación de pantalla, toda la actividad es destruida y recreada. Al mismo tiempo, el Diálogo que tenías anteriormente se vuelve a crear en la nueva Actividad, pero la antigua tarea de fondo todavía se refiere a la antigua Actividad cuando intenta descartar el diálogo. El resultado es que descarta un diálogo que fue destruido hace mucho tiempo, en lugar de descartar el diálogo de la nueva orientación creada.

Hay tres soluciones básicas:

  1. Anule el código de manejo de orientación predeterminado para que su actividad no se destruya al girar. Esta es probablemente la respuesta menos satisfactoria, ya que bloquea una gran cantidad de código que se ejecuta automáticamente en los cambios de orientación.

  2. Cree una variable miembro estática de su actividad que haga referencia a la actividad en sí, para que pueda llamar a STATIC_ACTIVITY_VARIABLE.dismissDialog() .

  3. Codifique una solución en la que la tarea de fondo realiza un seguimiento de la Actividad actual y se actualiza según sea necesario.

Estas tres soluciones se analizan en detalle aquí: http://groups.google.com/group/android-developers/browse_thread/thread/bf046b95cf38832d/

Hay una mejor solución a este problema ahora que implica el uso de fragmentos.

Si crea un diálogo con DialogFragment, este fragmento será responsable de mantener el ciclo de vida de su diálogo. Cuando muestra un cuadro de diálogo, proporciona una etiqueta para su fragmento ( DialogFragment.show () ). Cuando necesite acceder a su diálogo, busque el DialogFragment necesario utilizando FragmentManager.findFragmentByTag en lugar de tener una referencia al propio diálogo.

De esta manera si el dispositivo cambia de orientación, obtendrá un nuevo fragmento en lugar del antiguo, y todo funcionará.

Esto es largo después de que la pregunta fue hecha y contestada, pero tropecé en este problema también y quise compartir mi solución …

Comprobar onSavedInstance () que se ejecuta en el cambio de orientación, si el diálogo se muestra o no con dialog.isShowing (), y pasarlo a la variable outState. A continuación, en su onCreate (), comprueba esta var si es verdad. Si es así, simplemente descarta el diálogo con dialog.dismiss ()

Espero que esto ayude a otros :()

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.