窗体泄漏: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里。

猜你喜欢

转载自blog.csdn.net/user11223344abc/article/details/79879475