2010-09-22 5 views
11

Mon application jette souvent exception comme ci-dessous:jette souvent exception android.view.WindowLeaked -

E/WindowManager (6282): android.view.WindowLeaked: Activité com.myActivity a fui la fenêtre [email protected] que a été initialement ajouté ici

L'application affiche une boîte de dialogue de progression lorsque l'activité principale démarre et commence une tâche. Lorsque la tâche est terminée, le dialogue de progression est ignoré.

Mon code est comme ci-dessous. Est-ce que quelqu'un peut m'aider?

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 plupart du temps, l'exception a été levée à partir de l'appel showDialog(). L'autre fois, l'exception a été levée à partir de l'appel de rejectDialog().

Merci d'avance!

Répondre

6

Vous commencez une nouvelle activité dans doInBackground() avant de fermer la boîte de dialogue dans onPostExecute(), ce qui est probablement la cause de la fuite du dialogue. Je propose

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

à onPostExecute() après l'appel dismissDialog() et de voir ce qui se passe.

0

Il est également conseillé de placer un try ... catch autour

dismissDialog(ID_DIALOG_PROGRESS); 

Sinon, vous recevrez probablement application se bloque au hasard lorsque, dans certaines circonstances, la boîte de dialogue ne sont plus disponible par exemple après la rotation de l'écran.

Questions connexes