Android开发:在AsyncTask中使用Dialog出现的问题

方案一:

Android排错:has leaked window com.android.internal.policy.impl.PhoneWindow$ that was originally added here

异常场景:

经常在应用中需要处理一些耗时的工作,诸如读取大文件、访问网络资源等。为了避免因程序假死而带来的糟糕用户体验,通常我们可以通过线程+Handler或者Android提供的AsyncTask来解决该问题,并一般以ProgressDialog等提示性控件来告知用户当前的程序进度。而标题中描述的异常则会常常出现在这样的场景中,并且往往掩盖了导致异常的真正的罪魁祸首。

 

问题原因:

从异常描述中,大致的意思是存在窗口句柄泄露,即未能及时销毁某个PhoneWindow。而这往往误导了我们,把过多的精力放在查找所谓的内存泄露上了。其实存在这么一种情况,即因我们在非主线程中的某些操作不当而产生了一个严重的异常,从而强制当前Activity被关闭。而在关闭的同时,却没能及时的调用dismiss来解除对ProgressDialog等的引用,从而系统抛出了标题中的错误,而掩盖了真正导致这个错误的异常信息。

 

解决方法之一:

本解决方法并不能真正的解决问题,但是在一定程度上可以将真正导致错误的异常信息显露出来。即重写Activity的onDestroy方法,在方法中调用dismiss来解除对ProgressDialog等的引用。


方案二:

最近在用AsyncTask来做一个更新包的下载操作,其中牵扯到连接服务器Dialog提示,是否下载更新包Dialog等,当下载完后,自动跳转到安装界面。在模拟器上测试一切正常,但是放在真机上测试时,下载完成关闭更新界面会出现下面这些异常。主要是‘

01-08 01:49:27.874: ERROR/WindowManager(473): Activity com.Activity has leaked windowandroid.widget.UpgradeDialog@43e40d10 that was originally added here

01-08 01:49:27.874: ERROR/WindowManager(473): Android.view.WindowLeaked: Activity com.Activity has leaked window android.widget.UpgradeDialog@43e40d10 that was originally added here

找了一些资料 主要原因是说你finish activity 没有关闭附加上面的Dialog 导致(内存)漏出 

检查了一下 在finish前把使用到的不为空的Dialog都调用 dismiss()方法就不会出现了


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值