最近开发程序的时候,遇到这样一个错误,窗体句柄泄露问题:
描述如下:
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,的时候就要销毁他的依附对象,导致多弹的那次,依然在显示,但是依附对象没有了,才出现上述问题!