android.view.WindowLeaked:has leaked window com.android.internal.policy.PhoneWindow$DecorView解决办法

最近开发程序的时候,遇到这样一个错误,窗体句柄泄露问题:

描述如下:

android.view.WindowLeaked: Activity com.wcyq.gangrong.ui.activity.MainActivity has leaked window com.android.internal.policy.PhoneWindow$DecorView{4a49508 V.E...... R....... 0,0-520,171} that was originally added here
                                                                    at android.view.ViewRootImpl.(ViewRootImpl.java:464)
                                                                    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:306)
                                                                    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:90)
                                                                    at android.app.Dialog.show(Dialog.java:325)
                                                                    at com.wcyq.gangrong.base.BaseFragment.dilagStyleInfo(BaseFragment.java:309)
                                                                    at com.wcyq.gangrong.base.BaseFragment.checkTokenInvalid(BaseFragment.java:291)
                                                                    at com.wcyq.gangrong.ui.fragment.HomeFragment.onHomeListDataSuccess(HomeFragment.java:552)
                                                                    at com.wcyq.gangrong.presenter.impl.HomePresenterImpl$1.onSucess(HomePresenterImpl.java:40)
                                                                    at com.wcyq.gangrong.network.HttpRequest$3.onSuccess(HttpRequest.java:135)
                                                                    at com.wcyq.gangrong.network.HttpRequest$3.onSuccess(HttpRequest.java:130)

网上搜了一大堆, 都是说dialog 在依附的Activity, 之前没有销毁,acitivity却销毁了,导致窗体泄露, 按照网上的,操作设置,并检查了之前项目写的代码,然后发现,

在:

 @Override
    public void onDestroy() {
        super.onDestroy();
        if (dialog != null) {
            dialog.dismiss();
            dialog = null;
        }

    }

 处理了,还是有依然报窗体泄露这个错误! 想了好两三天用排除法发现,还有一个隐藏的细节要注意, dialog忽略了可能谈出两次的情况.也就是把dialog设置成单例, 如果这个dialog弹了一次,并且还没有销毁,就不要让他再次弹一次,按照这个思路改了之后,窗体泄露问题得到了很好的解决! 代码如下;

 protected void dilagStyleInfo(final Activity activity) {
        if(dialog!=null){
            return;
        }
        dialog = new ToastStyle2Dialog(mActivity, Constant.LOGIN_INVALID, new ToastStyle2Dialog.OnClickconfirmListener() {
            @Override
            public void confirm() {
                Constant.APP_THEME_COLOR = "#005699";
                goActicity(LoginActivity.class);
                activity.finish();
                ActivityUtils.finishAllActivitiesExceptNewest();
                return;
            }
        });
        dialog.show();


        //dialog弹出时,禁用返回键!
        dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
            @Override
            public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
                return true;
            }
        });
    }
问题得到了很好的解决! 也许遇到类似问题的朋友和我目前遇到的情况不一样,但是原理都差不多,就是dialog 没有销毁前,他依附的对象销毁了,才导致窗体泄露, 我的是点击dialog,的时候就要销毁他的依附对象,导致多弹的那次,依然在显示,但是依附对象没有了,才出现上述问题!

你可能感兴趣的:(安卓Bug)