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

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

你可能感兴趣的:(has leaked window com.android.internal.policy.impl.PhoneWindow解决(Dialog.cancel、dismiss、hide区别))