关于 android.view.WindowLeaked: 窗体泄露

android.view.WindowLeaked

1 具体报错

E/WindowManager: android.view.WindowLeaked: Activity com.xzln.loginapp.RegisterActivity has leaked window DecorView@7ee3cf7[RegisterActivity] that was originally added here
        at android.view.ViewRootImpl.<init>(ViewRootImpl.java:733)
        at android.view.ViewRootImpl.<init>(ViewRootImpl.java:717)
        at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:399)
        at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:109)
        at android.app.Dialog.show(Dialog.java:340)
        at com.xzln.loginapp.RegisterActivity.onClick(RegisterActivity.java:172)
        at android.view.View.performClick(View.java:7448)
        at android.view.View.performClickInternal(View.java:7425)
        at android.view.View.access$3600(View.java:810)
        at android.view.View$PerformClick.run(View.java:28305)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

...

2 分析原因

Android 的每一个 Activity 都有个 WindowManager 窗体管理器,

同样,构建在某个 Activity 之上的对话框、PopupWindow 也有相应的 WindowManager 窗体管理器。

因为对话框、PopupWindown 不能脱离 Activity 而单独存在着,

所以当某个 Dialog (或 PopupWindow) 正在显示的时候去 finish() 了承载该 Dialog (或 PopupWindow )的 Activity 时,就会抛 Window Leaked 异常了,

因为这个 Dialog (或 PopupWindow)的WindowManager已经没有谁可以附属了,所以它的窗体管理器已经泄漏了。

android.view.WindowLeaked 一般会发生在 Activity 与 Dialog 的显示。

Activity 中 create 一个 Dialog ,若先关闭 Dialog 再关闭 Activity 就是正常的,

若先关闭 Activity 再关闭Dialog 就会报错这个android.view.WindowLeaked错误了。

分析:Dialog 是基于 Activity 而创建的:new ProgressDialog(this);this 就是 Activity。

Activtity 先 finish, 那 Dialog 就没得依附了,所以就会报 android.view.WindowLeaked。

3 具体代码分析

1 finish()的执行过程
(这里是需要对并发/行的思考)
在这里插入图片描述
如上述代码框起来的部分,执行finish()结束Activity的时候,并不会结束这个case代码块,而导致穿透执行下一个case而创建了Dialog
解决方法:
break取消注释

2 dialog.show()finish的问题
出问题的写法:
在这里插入图片描述
如上。
从测试过程的现象,猜测在当前的执行流程中,dialog.show()并不会阻塞,因此不会等你点PositiveButton之后才会继续执行方框中的代码。
(望大佬指教!!)

解决方法:(解决的写法)
在这里插入图片描述
也就是把finish()放到dialog的dismiss/cancel之后执行
(这里涉及到他们的生命周期,自行查看/)
这样就能保证在Activity执行finish之前把附属其上的dialog给关闭掉。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值