vancel

更新时间:2022-11-24 07:23:54 阅读: 评论:0


2022年11月24日发(作者:口碑网福州)

使⽤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.(:368)

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小时内删除。

上一篇:affect例句
下一篇:away
标签:vancel
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图