2010-09-22 10 views
11

mia app lancia frequentemente eccezione come di seguito:mia app lancia frequentemente eccezione android.view.WindowLeaked -

E/WindowManager (6282): android.view.WindowLeaked: Attività com.myActivity è trapelato finestra [email protected] che è stato originariamente aggiunto qui

L'applicazione mostra una finestra di avanzamento quando l'attività principale inizia e inizia un compito. Al termine dell'attività, la finestra di dialogo dell'avanzamento verrà chiusa.

Il mio codice è come di seguito. Qualcuno può aiutarmi?

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); 
    } 
} 
} 

Nella maggior parte dei casi, l'eccezione è stata generata dalla chiamata showDialog(). L'altra volta, l'eccezione è stata generata dalla chiamata dismissDialog().

Grazie in anticipo!

risposta

6

Stai iniziando una nuova attività in doInBackground() prima di chiudere la finestra di dialogo in onPostExecute(), che probabilmente causa la perdita della finestra di dialogo. Vorrei spostare

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

al onPostExecute() dopo la chiamata dismissDialog() e vedere cosa succede.

0

E 'anche buona norma inserire un try ... catch intorno

dismissDialog(ID_DIALOG_PROGRESS); 

In caso contrario si avrà probabilmente riceverà crash dell'applicazione casuali quando in alcune circostanze la finestra di dialogo non è più disponibile per esempio dopo la rotazione dello schermo.

Problemi correlati