Android 开发 对话框Dialog setondismisslistener和hide方法的区别

匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。一个Bug前几日出现这样一个Bug是一个RuntimeException,详细信息是这样子的:
复制代码代码如下:
java.lang.IllegalArgumentException: View not attached to window manager&&& at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:356)&&& at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:201)&&& at android.view.Window$LocalWindowManager.removeView(Window.java:400)&&& at android.app.Dialog.dismissDialog(Dialog.java:268)&&& at android.app.Dialog.access$000(Dialog.java:69)&&& at android.app.Dialog$1.run(Dialog.java:103)&&& at android.app.Dialog.dismiss(Dialog.java:252)&&& at xxx.onPostExecute(xxx$1.java:xxx)
首先是Google了下,发现引发这个的原因基本上都一致都是Dismiss对话框的时候,Activity已经不再存在。常发生这类Exception的情形都是,有一个费时的线程操作,需要在显示一个ProgressDialog,在任务开始的时候显示一个对话框,然后当任务完成了再Dismiss对话框,如果在此期间如果Activity因为某种原因被杀掉且又重新启动了,那么当Dismiss的时候WindowManager检查发现Dialog所属的Activity已经不存在了,所以会报IllegalArgumentException: View not attached to window manager.其实此类Exception的一重要的原因是,ProgressDialog的创建显示和取消都允许在非UI线程中进程。在Android当中非UI线程是不允许操作UI相关的事情,比如添加移除View等,但是为会么允许创建显示和取消对话框呢?而且还有可能引发此Exception导致应用Crash。要想避免此类Exception,就要正确的使用对话框,也要正确的使用线程。正确的使用对话框不要在非UI线程中使用对话框创建,显示和取消对话框。那么对于异步操作显示对话框怎么办呢?Activity都有相应的操作对话框的回调比如onCreateDialog(),showDialog(),dimissDialog(),removeDialog()等等。这些因为都是Activity的方法,所以用起来更方便,也不用显示创建和操控Dialog对象,一切都由框架操控,相对来说比较安全。另外就是一定要让对话框对象在Activity的可控制范围之内和生命周期之内,比如一定要是它的成员变量,并且在让对话框变量活跃在Activity的onCreate()和onDestroy()之间。正确的使用线程尽量少用单独线程,除非是真正的费时操作才用线程,线程也不要直接用Java式的匿名线程,除非是那种单纯的操作,操作完成后不需要做其他事情的。尽可能多用Android提供的类比如AsyncTask等。另外如果线程操作过程中还需要与主线程有交互,那么最好保存一个线程的对象,并且线程内部最有一定的控制,这样可以让Activity更好的操控线程。如果说某些操作是特别费时的,且是经常性的操作,比如从网络获取数据,或是从后台读取文件,或是导入/导出,恢复/备份的事情,最好放到后台Service中去做,然后在StatusBar中给出相应进度。
Views(...) Comments()1053人阅读
踩坑记录(28)
Android 零碎知识(94)
项目中有个Activity中用到了ProgressDialog,而在跳转到下个Activity时就会报这个错:
has leaked window com.android.internal.policy.impl.PhoneWindow$ that was originally added here
之前还没注意这个错误,看字面意思是泄露了窗口,什么意思呢?
原来,在初始化时有:
mProgressDialog = new ProgressDialog(this);
而由ProgressDialog的构造函数可以看到,传入的是一个Context,dialog可以看做引用了当前Context
public ProgressDialog(Context context) {
& & & & super(context);
& & & & initFormats();
这样就可以理解为什么跳转时会提示这个错误了,我在finish当前Activity时没有将dialog置为null,导致那个Activity一直被引用,GC不能及时回收,这就是泄露。
知道原因后就好做了,在onDestroy中调用:
if(mProgressDialog != null && mProgressDialog.isShowing()){
& & & & & & //mProgressDialog.hide();
& & & & & & mProgressDialog.dismiss();
& & & & & & mProgressDialog =
看来,让dialog消失有好几种方法: hide、cancel、dismiss,有什么区别呢?
dismiss方法会释放对话框所占的资源,而hide方法不会。activity退出前必须调用dismiss方法关闭对话框。所以,最正确的调用方法是,在activity的onDestory方法里调用dismiss方法,其他地方都用hide方法隐藏对话框。
(来自:http://blog.csdn.net/leeo1010/article/details/)
而cancel其实是在调用dismiss之前执行注册OnCancelListener的事件,如果注册了的话。
现在问题清楚了,就是如果你在创建AlertDialog的时候调用了setOnCancelListener 这个mCancelMessage变量有作用,否则dismiss和cancel等同。
(来自:/blog/975131)
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1162259次
积分:13776
积分:13776
排名:第1012名
原创:255篇
转载:76篇
译文:15篇
评论:851条
我是会成为架构师的男人!
《走心的中级安卓工程师跳槽经验分享》
9 月份最新的中级安卓面试经验,这次跳槽我面试了 5 家全部拿到 offer,总结分享给大家。
如果您觉得我的文章有帮助,欢迎打赏我,那将是极大的鼓励
我的微信:sxkejinet
文章:12篇
阅读:43394
文章:15篇
阅读:50971
文章:34篇
阅读:144823
(1)(1)(2)(2)(9)(12)(9)(3)(2)(2)(6)(4)(13)(22)(14)(19)(9)(2)(7)(5)(9)(9)(25)(7)(3)(39)(13)(32)(29)(24)(4)(1)(2)(2)(2)(1)android中dismissDialog(200)之前能判断这个对话框是否为打开的吗? - ITeye问答
showDialog(200)
...
if(***){
dismissDialog(200);
}
问题补充:谢谢你啊,我最后选择使用removeDialog了。飞雪无情 写道这个是没有的。不过一般你配对使用的话也不会出现什么问题。可能的话可以使用removeDialog(id),因为他不会有什么异常抛出。
问题补充:这个怎么用?gundumw100 写道有个isShowing()方法
问题补充:你这个dialog不带id?gundumw100 写道if(dialog.isShowing()){
//doSomething
}
isShowing()又不是activity的方法。干嘛要有Id。
你要交给activiyt托管才要id,这个时候不用判断dialog是否打开的。
if(dialog.isShowing()){
//doSomething
}
有个isShowing()方法
这个是没有的。不过一般你配对使用的话也不会出现什么问题。可能的话可以使用removeDialog(id),因为他不会有什么异常抛出。
已解决问题
未解决问题

我要回帖

更多关于 dismiss as 的文章

 

随机推荐