当前位置: 移动技术网 > IT编程>移动开发>Android > 探讨:你真的会用Android的Dialog吗?

探讨:你真的会用Android的Dialog吗?

2019年07月24日  | 移动技术网IT编程  | 我要评论

魔眼挑情,血灵神,九七惠

一个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中给出相应进度。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网