¿Argumento de excepción ilegal? ¿Por qué?

¿Puede alguien explicarme por qué ocurre este error, o incluso mejor cómo lo manejo? No puedo reproducirlo. Es uno de esos errores que sucede una vez de un 1000.

Antecedentes: El usuario está intentando iniciar sesión, se muestra un diálogo de progreso, se envía una solicitud http en una tarea asíncrona y se desactiva el diálogo de progreso. Ocurrió un error, app FC.

LoginActivity.java

255: private void dismissProgress() { 256: if (mProgress != null) { 257: mProgress.dismiss(); 258: mProgress = null; 259: } 260: } java.lang.IllegalArgumentException: View not attached to window manager at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:391) at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:236) at android.view.Window$LocalWindowManager.removeView(Window.java:432) at android.app.Dialog.dismissDialog(Dialog.java:278) at android.app.Dialog.access$000(Dialog.java:71) at android.app.Dialog$1.run(Dialog.java:111) at android.app.Dialog.dismiss(Dialog.java:268) at se.magpern.LoginActivity.dismissProgress(LoginActivity.java:257) at se.magpern.LoginActivity.access$5(LoginActivity.java:255) at se.magpern.LoginActivity$DoTheLogin.onPostExecute(LoginActivity.java:293) at se.magpern.LoginActivity$DoTheLogin.onPostExecute(LoginActivity.java:1) at android.os.AsyncTask.finish(AsyncTask.java:417) at android.os.AsyncTask.access$300(AsyncTask.java:127) at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:144) at android.app.ActivityThread.main(ActivityThread.java:4937) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:521) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) at dalvik.system.NativeStart.main(Native Method) 

Esto puede suceder si el usuario rechaza la vista (por ejemplo, un cuadro de diálogo desde el que se puede salir) o si el usuario cambia a una actividad diferente mientras se ejecuta la tarea. Deberías pensar seriamente en usar la actividad de Android, mostrando / desechando el diálogo nativo en lugar de intentar mantener una referencia a las vistas tú mismo. Pero si lo está manejando usted mismo, puede que desee comprobar si el diálogo está mostrando realmente usando el método isShowing() del diálogo antes de intentar descartarlo.

He visto esto suceder cuando una actualización latente entra en un diálogo de progreso que ya ha sido total o parcialmente rechazado. El usuario está solicitando un despido al mismo tiempo que el sistema operativo está intentando rechazar la vista y ya ha sido desconectado de la ventana o viceversa.

Hay una condición de carrera entre el código que descarta la ventana de progreso cuando se hace clic en un botón y el código que descarta la ventana de progreso de otra manera. El lugar más probable para buscar esta condición de carrera es donde sus solicitudes para despedir las ventanas se ponen en el hilo de vista (controlador de botones o un código de devolución de llamada).

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