我的应用经常抛出android.view.WindowLeaked异常 -

时间:2010-09-22 19:57:26

标签: android

我的应用经常抛出异常,如下所示:

  

E / WindowManager(6282):android.view.WindowLeaked:Activity   com.myActivity泄露了窗口   com.android.internal.policy.impl.PhoneWindow$DecorView@4479b710那个   最初是在这里添加的

当主要活动开始并启动任务时,应用程序会显示进度对话框。任务完成后,它将关闭进度对话框。

我的代码如下所示。有人能帮助我吗?

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

大多数情况下,showDialog()调用抛出了异常。另一次,异常是从dismissDialog()调用抛出的。

提前谢谢!

2 个答案:

答案 0 :(得分:6)

doInBackground()中关闭对话框之前,您正在onPostExecute()开始新活动,这可能是导致对话框泄漏的原因。我会搬家

Intent intent = new Intent(MyActivity.this, OtherActivity.class);
startActivityForResult(intent, 1000);
onPostExecute()电话会议后

dismissDialog(),看看会发生什么。

答案 1 :(得分:0)

这也是一个很好的做法,试一试......抓住

dismissDialog(ID_DIALOG_PROGRESS);

否则,在某些情况下,对话框不再可用,您可能会收到随机应用程序崩溃,例如屏幕旋转后。