由于我的自定义对话框导致泄漏窗口错误?

时间:2016-07-04 23:46:08

标签: android dialog

我打电话给dismiss,但我仍然收到错误:

activity has leaked window com.android.internal.policy.PhoneWindow$DecorView that was originally added here

后面是这个错误:

j ava.lang.IllegalArgumentException: View=com.android.internal.policy.PhoneWindow$DecorView{a49b58 V.E...... R....... 0,0-1368,224} not attached to window manager

这是我的自定义进度对话框:

public class CustomProgressDialog extends ProgressDialog {

    private AnimationDrawable animation;

    public CustomProgressDialog(Context context) {
        super(context);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.custom_progress_dialog);


        ImageView la = (ImageView) findViewById(R.id.animation);
        if (la != null) {

            la.setBackgroundResource(R.drawable.custom_progress_dialog_animation);
            animation = (AnimationDrawable) la.getBackground();
        }

    }

    @Override
    public void show() {
        super.show();
        animation.start();
    }

    @Override
    public void dismiss() {
        super.dismiss();
        animation.stop();
    }


    @Override
    public void setOnCancelListener(OnCancelListener listener) {
        super.setOnCancelListener(listener);
        dismiss();
    }
}

这是我在活动中实现它的方式:

private void showProgressDialog() {

        customProgressDialog = new CustomProgressDialog(this);
        customProgressDialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
        customProgressDialog.show();
        //so it cannot be closed by user first one lets back button cancel it
        //customProgressDialog.setCanceledOnTouchOutside(false);
        customProgressDialog.setCancelable(false);
        autoProgressShutdown();

    }

    private void hideProgressDialog() {
        pdCanceller.removeCallbacksAndMessages(null);
        if (customProgressDialog != null) {

            customProgressDialog.dismiss();
        }
    }

登录时,我调用了这个方法来杀死任何打开的对话框:

private void takeToHome() {

        hideProgressDialog();

        Intent homeIntent = new Intent(this, MainHome.class);
        homeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
        homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        homeIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
        startActivity(homeIntent);

        customProgressDialog.dismiss();
        finish();
    }

我尝试过的一些更改也失败了,在hideProgress对话框中我将它从.hide()更改为.dismiss()然后我故意调用它。在再次结束之前解雇()以确保没有错过,但是在切换到家时它仍然存在错误并且有时会崩溃,它会随之消失。

我在执行异步任务时显示对话框,例如登录以确保用户知道它正在加载,一旦完成动画停止并且它似乎被隐藏但是在完成时崩溃---现在我无论我在哪里使用异步调用,它都会在整个应用程序中实现这一点,它也会在整个应用程序中崩溃。关于我做错了什么或者如何在切换到其他活动之前销毁对话框的任何建议

1 个答案:

答案 0 :(得分:0)

请尝试这个customProgressDialog为null然后才应该创建一个对象,根据我的思想对象第一次创建然后再次尝试创建对象。然后只有这个泄漏窗口错误来了并检查 当对话框被解雇时

if (dialog != null && dialog.isShowing()) {
                    dialog.dismiss();
                }

如果你想在那个tiem上显示一个对话框来应用这个编码。

if (dialog != null && !dialog.isShowing()) {
        dialog.show();
    }