前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >has leaked window com.android.internal.policy.impl.PhoneWindow解决(Dialog.cancel、dismiss、hide区别)

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

作者头像
张拭心 shixinzhang
发布2022-05-06 18:46:50
4450
发布2022-05-06 18:46:50
举报

项目中有个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)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-12-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档