我有一个活动,在显示进度对话框的同时从后台获取一些数据.当我得到数据(或错误)时,我会忽略该对话框并显示另一个对话框.
如果由于某种原因网站花费太长时间来传送响应(例如15秒),手机将关闭屏幕.现在,当屏幕关闭时,如果我得到响应并尝试显示对话框,则会出现错误(WindowManager $BadTokenException:无法添加窗口 – 令牌android.os.BinderProxy@483fa968无效;是您的活动正在运行?)
这个问题的原因很简单:当屏幕关闭时,另一个活动来到前台(键盘或其他东西).
问题:现在,对于我们知道可能没有运行的活动,最好的方法是调用showDialog吗? (活动已创建,但它不是用户正在与之交互的活动…换句话说,它处于停止状态).
我相信如果我点击主页并更改为Home活动,就会发生类似的行为. (虽然我不能在我的特定情况下这样做,因为我的活动将取消请求,一切都会正确关闭).
我不认为这有任何区别,但我在Android 2.1中重现了这一点
解决方法
捕获该异常并使用某种持久存储来保存一个标志,表明您正在等待显示对话框.然后在onResume()中检查该标志,如果它的真实,则显示相应的对话框.也许这样的东西:
try { getYourDataFromWeb(); showDialog() } catch (BadTokenException e) { myPrefsEditor.putBoolean("FailedToShowDialog",true); myPrefsEditor.commit(); e.printStackTrace(); }
然后在你的onResume()方法中这样:
if(myPrefs.getBoolean("FailedToShowDialog",false) == true){ showDialog(); myPrefsEditor.putBoolean("FailedToShowDialog",false); myPrefsEditor.commit(); }