2010-12-22 13 views
6

Tengo una actividad que obtiene algunos datos de Internet en segundo plano mientras muestra un cuadro de diálogo de progreso. Cuando obtengo los datos (o un error) descarto ese diálogo y muestro otro.Activity.showDialog cuando la actividad puede no estar en primer plano

Si por alguna razón el sitio web tarda demasiado en entregar la respuesta (más de 15 segundos por ejemplo), el teléfono apagará la pantalla. Ahora, mientras la pantalla está apagada, si recibo una respuesta y trato de mostrar un cuadro de diálogo, habrá un error (WindowManager $ BadTokenException: no se puede agregar la ventana - token [email protected] no es válido; es su ¿actividad en ejecución?)

El motivo de este problema es simple: cuando la pantalla se apaga, otra actividad aparece en primer plano (bloqueo del teclado o algo así).

Pregunta: Ahora, cuál es el mejor método para invocar showDialog en una actividad que sabemos que podría no estar en ejecución? (la actividad fue creada pero no es con la que el usuario está interactuando ... en otras palabras, está en estado detenido).

Creo que un comportamiento similar ocurriría si hiciera clic en el inicio y cambiara a la actividad de Inicio. (Aunque no puedo hacer esto en mi caso particular porque mi actividad cancelaría la solicitud y todo se cerraría correctamente).

No creo que esto hace alguna diferencia, pero reproduje esto en Android 2.1

+0

es posible que desee poner algún código en los métodos 'onPause, onResume, onDestroy, onStop'. De esta forma, si se llama a 'onPause' (o lo que sea) antes de que se complete el hilo, y' onResume' no se llama antes de que se complete, sabrá el estado de la actividad que inició el hilo y sabrá si puede mostrar un cuadro de diálogo – binnyb

+0

Pero quiero mostrar el cuadro de diálogo. Si el usuario no ve la actividad, cuando vuelva a mi actividad, quiero que muestre el diálogo ... –

Respuesta

10

Catch excepción y que utilizan algún tipo de almacenamiento persistente para salvar una bandera que muestra que usted está esperando para mostrar un cuadro de diálogo . Luego, en onResume(), marque esa bandera y si es verdadera, muestre el diálogo apropiado. Algo como esto quizá:

try { 
    getYourDataFromWeb(); 
    showDialog() 
} catch (BadTokenException e) { 
    myPrefsEditor.putBoolean("FailedToShowDialog", true); 
    myPrefsEditor.commit(); 
    e.printStackTrace(); 
} 

Luego, en su onResume() de algo como esto:

if(myPrefs.getBoolean("FailedToShowDialog", false) == true){ 
    showDialog(); 
    myPrefsEditor.putBoolean("FailedToShowDialog", false); 
    myPrefsEditor.commit(); 
} 
+0

La idea detrás de esto funciona :) ¡gracias! Voy a publicar un código de cómo lo hice más tarde (hay algunas capturas) –

+0

@PedroLoureiro Más tarde ... como 6 años después, tal vez? :) ¡Debes mantener tu promesa de Navidad! –

1

utilizo a continuación código para juzgar si mi actividad destino está en primer plano. si no, no aparezca el cuadro de diálogo.

ActivityManager am = (ActivityManager)Update.this.getSystemService(Context.ACTIVITY_SERVICE); 
ComponentName cn = am.getRunningTasks(1).get(0).topActivity; 
if(cn.getClassName().equals("com.xxx.xxx.xxxx") { 
    showDialog(); 
} 
Cuestiones relacionadas