我有一个活动,在显示进度对话框的同时从后台获取一些数据。当我得到数据(或错误)时,我会忽略该对话框并显示另一个对话框。
如果由于某种原因网站花费太长时间来传送响应(例如15秒以上),手机将关闭屏幕。现在,当屏幕关闭时,如果我得到响应并尝试显示对话框,则会出现错误(WindowManager $ BadTokenException:无法添加窗口 - 令牌android.os.BinderProxy@483fa968无效;是您的活动正在运行?)
这个问题的原因很简单:当屏幕关闭时,另一个活动来到前台(键盘或其他东西)。
问题:现在,对于我们知道可能未运行的活动,调用showDialog的最佳方法是什么? (活动已创建,但它不是用户正在与之交互的活动...换句话说,它处于停止状态。)
我相信如果我点击主页并更改为Home活动,就会发生类似的行为。 (虽然我不能在我的特定情况下这样做,因为我的活动会取消请求,一切都会正确关闭)。
我认为这没有任何区别,但我在Android 2.1中重现了这一点
答案 0 :(得分:11)
捕获该异常并使用某种持久存储来保存一个标志,表明您正在等待显示对话框。然后在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();
}
答案 1 :(得分:1)
我使用下面的代码来判断我的命运活动是否在前台。如果没有,请不要弹出对话框。
ActivityManager am = (ActivityManager)Update.this.getSystemService(Context.ACTIVITY_SERVICE);
ComponentName cn = am.getRunningTasks(1).get(0).topActivity;
if(cn.getClassName().equals("com.xxx.xxx.xxxx") {
showDialog();
}