2010-09-22 20 views
11

Mi aplicación con frecuencia lanza una excepción, como a continuación:Mi aplicación con frecuencia lanza excepción android.view.WindowLeaked -

E/WindowManager (6282): android.view.WindowLeaked: Actividad com.myActivity ha filtrado ventana [email protected] que se añadió originalmente aquí

La aplicación muestra un cuadro de diálogo de progreso cuando la principal actividad se inicia y comienza una tarea. Cuando la tarea finaliza, descarta el diálogo de progreso.

Mi código es como a continuación. ¿Alguien me puede ayudar?

public class MyActivity extends Activity { 

private static int ID_DIALOG_PROGRESS = 2001; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);   
    setContentView(R.layout.my_activity); 
    showDialog(ID_DIALOG_PROGRESS); 
    new MyTask().execute(null, null, null); 
} 

@Override 
protected Dialog onCreateDialog(int id) { 
    if (id == ID_DIALOG_PROGRESS) { 
     ProgressDialog loadingDialog = new ProgressDialog(this); 
     loadingDialog.setTitle(""); 
     loadingDialog.setMessage(""); 
     loadingDialog.setIndeterminate(true); 
     loadingDialog.setCancelable(false); 
     return loadingDialog; 
    } 

    return super.onCreateDialog(id); 
} 

private class MyTask extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... arg0) { 

      /* Do something expensive here...*/ 

      /* Start other activity*/ 
      Intent intent = new Intent(MyActivity.this, OtherActivity.class); 
      startActivityForResult(intent, 1000); 
     } 

     return null; 
    } 

    protected void onPostExecute(Void arg0) { 
     dismissDialog(ID_DIALOG_PROGRESS); 
    } 
} 
} 

La mayoría de las veces, la excepción se produjo desde la llamada a showDialog(). La otra vez, la excepción fue lanzada desde la llamada a dismissDialog().

¡Gracias de antemano!

Respuesta

6

Está iniciando una nueva actividad en doInBackground() antes de cerrar el cuadro de diálogo en onPostExecute(), que es probablemente lo que causa el escape del cuadro de diálogo. Me mudaría

Intent intent = new Intent(MyActivity.this, OtherActivity.class); 
startActivityForResult(intent, 1000); 

a onPostExecute() después de la llamada dismissDialog() y ver qué pasa.

0

También es útil colocar un try ... catch alrededor

dismissDialog(ID_DIALOG_PROGRESS); 

De lo contrario, probablemente recibirá aplicación se bloquea al azar cuando en algunas circunstancias el diálogo ya no está disponible, por ejemplo, después de la rotación de la pantalla.

Cuestiones relacionadas