has leaked window com.android.internal.policy.impl.PhoneWindow解决(Dialog.cancel、dismiss、hide区别)

2022-05-06 18:46:50 浏览数 (1)

项目中有个Activity中用到了ProgressDialog,而在跳转到下个Activity时就会报这个错: has leaked window com.android.internal.policy.impl.PhoneWindow$ that was originally added here 之前还没注意这个错误,看字面意思是泄露了窗口,什么意思呢? 原来,在初始化时有: mProgressDialog = new ProgressDialog(this); 而由ProgressDialog的构造函数可以看到,传入的是一个Context,dialog可以看做引用了当前Context public ProgressDialog(Context context) {         super(context);         initFormats();     } 这样就可以理解为什么跳转时会提示这个错误了,我在finish当前Activity时没有将dialog置为null,导致那个Activity一直被引用,GC不能及时回收,这就是泄露。 知道原因后就好做了,在onDestroy中调用: if(mProgressDialog != null && mProgressDialog.isShowing()){             //mProgressDialog.hide();             mProgressDialog.dismiss();             mProgressDialog = null;

        }

看来,让dialog消失有好几种方法: hide、cancel、dismiss,有什么区别呢? dismiss方法会释放对话框所占的资源,而hide方法不会。activity退出前必须调用dismiss方法关闭对话框。所以,最正确的调用方法是,在activity的onDestory方法里调用dismiss方法,其他地方都用hide方法隐藏对话框。

(来自:http://blog.csdn.net/leeo1010/article/details/36420927)

而cancel其实是在调用dismiss之前执行注册OnCancelListener的事件,如果注册了的话。 现在问题清楚了,就是如果你在创建AlertDialog的时候调用了setOnCancelListener 这个mCancelMessage变量有作用,否则dismiss和cancel等同。 (来自:http://luren85.iteye.com/blog/975131)

0 人点赞