1.总结下Dialog相关的异常
1.异常信息
android.view.WindowLeaked: Activity com.hy.fly.ui.activity.usercenter.SettingActivity has leaked window com.android.internal.policy.PhoneWindow$DecorView{d33b756 V.ED..... R......D 0,0-1080,135} that was originally added here at android.view.ViewRootImpl.<init>(ViewRootImpl.java:394) at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:330) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85) at android.app.Dialog.show(Dialog.java:346) at com.hy.fly.ui.fragment.usercenter.account.SettingsFragment.OnConfirm(SettingsFragment.java:201) at com.hy.fly.widget.CommonDialog.onDialogClick(CommonDialog.java:73) at com.hy.fly.base.BaseDialog.onClick(BaseDialog.java:38) at android.view.View.performClick(View.java:5264) at android.view.View$PerformClick.run(View.java:21297) at android.os.Handler.handleCallback(Handler.java:743) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:150) at android.app.ActivityThread.main(ActivityThread.java:5546) ...
2.导致异常发生的具体操作:
- 1.当界面是处于弹出Dialog的状况下,直接让应用退出;
- 2.点击Dialog的confirm按钮时,跳转至另一Activity;
- 3.以上操作都会导致日志中出现如上的异常,当然,跳转到另一Activity的时候,可能有时该异常时警告的,而不是error级别的,而我们没有注意到;
3.不管是何级别的异常,我们都得注意注意,那么为何会出现此异常信息
- 1.原因是这样的:Activity /Dialog /PopupWindow 都有相对应的WindowManager窗体管理器,而Dialog /PopupWindow 是依靠Activity而存在( 注意);
- 2.所以当Dialog /PopupWindow还在显示的时候,将其依靠的Activity直接销毁掉,就会抛Window Leaked异常了,因为Dialog /PopupWindow的WindowManager已经没有谁可以附属了,所以它的窗体管理器已经泄漏了.
4.既然知道了错误,那么就得去解决
1.Stack Overflow上的解决方案:
@Override public void onDestroy() { super.onDestroy(); if(mDialog!=null && mDialog.isShowing()){ mDialog.cancel(); } }
2. Api的setOnKeyListener记录
- 1.return true 的时候,点击手机回退物理键,Dialog不被取消,类似事件拦截
- 2.return false 的时候,点击手机回退物理键,Dialog被取消
- 3.当点击手机回退物理键的时候,不管返回true还是false,activity的onKeyDown方法都不会走
,可能被dialog抢走了事件