使⽤dialogshow()和cancel()常见的异常
上⼀篇讲了如何使⽤dialog,这⼀篇讲⼀讲使⽤dialogshow()和cancel()常见的异常,也就是⼀个dialog使⽤时机的问题。
由于dialog在新建的时候其实都传了⼀个Contex上下⽂进去,⼀般我们都是传使⽤这个dialog的那个activity的上下⽂。
1mPd=newProgressDialog(this);
也就是其实这⼀个dialog是和传⼊的activity绑定着的,所以如果activity已经finish了或者Destroy了,我们再调⽤dialog的show()或者
cancel():
1、finish之后你的dialog其实已经不合activity绑定了,所以会报notattachedtowindowmanager
2、由于activity已经不再使⽤,⽽你的dialog还引⽤着这个activity使⽤,所以会报ActivityxxxxxActivityhasleaked
出这个问题经常的场景就是⽐如,后台的asynctask在activity已经退出了还在继续下载,或者⾃⼰的操作,操作完了回来还想更新⼀下dialog
通知⽤户,但是此时dialog对应的activity已经不存在了。。。。
使⽤dialog和上下⽂状态或者说时机相关的异常:
dismis或者cancel的时候报了notattachedtowindowmanager
12-0113:54:09.375:E/AndroidRuntime(18146):lArgumentException:
View=indow$DecorView{b414dccV.E......R.....ID0,0-1026,450}notattachedtowindowmanager
12-0113:54:09.375:E/AndroidRuntime(18146):at
ewLocked(:424)
12-0113:54:09.375:E/AndroidRuntime(18146):View(:350)
12-0113:54:09.375:E/AndroidRuntime(18146):at
ViewImmediate(:116)
12-0113:54:09.375:E/AndroidRuntime(18146):sDialog(:362)
12-0113:54:09.375:E/AndroidRuntime(18146):s(:345)
12-0113:54:09.375:E/AndroidRuntime(18146):(:1199)
12-0113:54:09.375:E/AndroidRuntime(18146):at
tivity$ressUpdate(:85)
12-0113:54:09.375:E/AndroidRuntime(18146):at
tivity$ressUpdate(:1)
12-0113:54:09.375:E/AndroidRuntime(18146):ask$Message(:671)
12-0113:54:09.375:E/AndroidRuntime(18146):chMessage(:102)
12-0113:54:09.375:E/AndroidRuntime(18146):(:148)
12-0113:54:09.375:E/AndroidRuntime(18146):(:5417)
12-0113:54:09.375:E/AndroidRuntime(18146):(NativeMethod)
12-0113:54:09.375:E/AndroidRuntime(18146):Init$(:726)
12-0113:54:09.375:E/AndroidRuntime(18146):(:616)
最后报了Activityxxxxhasleaked,thatwasoriginallyaddedhere
12-0113:51:12.220:E/WindowManager(14101):Leaked:tivityhasleaked
indow$DecorView{b414dccV.E......R.......0,0-1026,450}thatwasoriginallyaddedhere
12-0113:51:12.220:E/WindowManager(14101):otImpl.
12-0113:51:12.220:E/WindowManager(14101):w(:299)
12-0113:51:12.220:E/WindowManager(14101):w(:85)
12-0113:51:12.220:E/WindowManager(14101):(:319)
12-0113:51:12.220:E/WindowManager(14101):k(:38)
12-0113:51:12.220:E/WindowManager(14101):mClick(:5198)
12-0113:51:12.220:E/WindowManager(14101):$(:21147)
12-0113:51:12.220:E/WindowManager(14101):Callback(:739)
12-0113:51:12.220:E/WindowManager(14101):chMessage(:95)
12-0113:51:12.220:E/WindowManager(14101):(:148)
12-0113:51:12.220:E/WindowManager(14101):(:5417)
12-0113:51:12.220:E/WindowManager(14101):(NativeMethod)
12-0113:51:12.220:E/WindowManager(14101):Init$(:726)
12-0113:51:12.220:E/WindowManager(14101):(:616)
12-0113:51:12.225:E/Surface(14101):getSlotFromBufferLocked:unknownbuffer:0xab4bdd90
12-0113:51:12.243:D/INFO(14101):canceled()
解决⽅法
1、对于notattachedtowindowmanager,需要在show(),dismiss(),cancel的时候判断⼀下当前activity的状态
在你认为有可能在activityfinish之后可能操作dialog的地⽅对contex添加⼀个状态的判断,如果状态正确才操作它。这个isFinishing()在⽤户
没有调⽤finish()或者这个activty没有开始finish流程的时候⼀直返回fal,之后⼀直返回true.
if(!shing()){
();
}
在4.2之后有新加⼀个isDestroyed判断是否已经destory了也可以,两者在时间点上有⼀点点差别,个⼈认为isFinish就可以保证不会出异常了
if(!royed()){
();
}
2、对于Activityxxxxhasleaked,thatwasoriginallyaddedhere
那就需要在onDestory()⾥⾯增加调⽤cancel,因为activity在destory的时候它对应的windowManager回去看当前还有没有view绑定在上⾯,
发现了这个dialog还在绑定在上⾯就会报错。
1@Override
2publicvoidonDestroy(){
roy();
4if(mDialog!=null&&ing()){
();
6}
7}
本文发布于:2022-11-24 07:23:54,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/10276.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |