窗体泄漏:Activity com.yyy.MainActivity has leaked window android.widget.xxxxx@43e40d10 that was original

异常信息:

Activity com.yyy.MainActivity has leaked window android.widget.xxxxx@43e40d10 that was originally added here

基本认识:

当Activity被销毁时,其包含的Dialog并未dissmiss而导致的。

解决方法:

总结了网上几种方法,基本没有优雅的解决方案。这里我列出我所搜集到的几种方案。

  • 在Activity释放之前,dissmiss掉dialog。

这是最常见,也是最好使的一种方案,但是它的弊端是,可能会打破项目架构内原有的封装体系。

  • 在Activity自身onDestroy的时候消除自身所依附的View和dialog

这只是一种思路,我写了代码但是并没有解决该异常,具体有没有彻底清除掉dialog还不确定,这里存疑,等后面研究了再进行一波分析。

ViewGroup view = (ViewGroup) getWindow().getDecorView();
view.removeAllViews();
  • 经过判断Activity的状态来对dialog show的控制
((Activity)context).isDestroyed();
((Activity)context).isFinishing();

我试了下,判断也没解决该bug。

思考:

这些只是一个技术点本身的问题,还有一些问题是外来的,经由我们选择的架构而产生的一些连带副作用。

譬如:

Splash页面一个登陆监测,根据监测结果判断是往主页走还是往登陆页走。在进行监测之前我们或许进行网络请求进行一些数据初始化,那么在这些数据初始化完成之前,页面被ondestroy了。
就这样一个场景,在我的项目里,用了rx+retro,我的dialog管理是基于重新封装的(Base)Observer来的,因为它能够管理Rx的几个回调。然后,我的登录监测是写在AspectJ里面的(AOP),并且在上述方式2,3不生效的情况下,我们的架构就成了阻碍我们解决这个bug的一道坎,因为如果我们想要直接或间接的操作BaseObser,那么必定要将其封装进base里。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值