android - Activity.showDialog 当 Activity 可能不在前台时

标签 android

我有一项 Activity 在显示进度对话框的同时在后台从互联网获取一些数据。当我获得数据(或错误)时,我关闭该对话框并显示另一个对话框。

如果由于某种原因网站响应时间过长(例如 15 秒以上),手机将关闭屏幕。现在,当屏幕关闭时,如果我得到响应并尝试显示对话框,将会出现错误(WindowManager$BadTokenException:无法添加窗口—— token android.os.BinderProxy@483fa968 无效;是你的 Activity 运行?)

这个问题的原因很简单:当屏幕关闭时,另一个 Activity 来到前台(keyguard 或其他东西)。

问题:现在,在我们知道 可能 未运行的 Activity 上调用 showDialog 的最佳方法是什么? ( Activity 已创建,但不是用户正在与之交互的 Activity 。换句话说,它处于停止状态)。

我相信如果我单击主页并更改为主页 Activity ,也会发生类似的行为。 (尽管在我的特定情况下我不能这样做,因为我的 Activity 会取消请求并且一切都会正确关闭)。

我认为这没有任何区别,但我在 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();
}

关于android - Activity.showDialog 当 Activity 可能不在前台时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4512896/

相关文章:

java - 使 Seekbar 遵循 MPAndroidChart X 值

java - 包裹:无法编码值 android.util.Pair

android - LocalStorage 与 Sqlite 数据库

java.lang.NoClassDefFoundError : com. squareup.okhttp.OkHttpClient

android - Android SpeechRecognizer 类能否识别音节/音素而不仅仅是完整的单词?

Android FileInputStream 从文件 :///to/file:/更改路径

java - 无法解析符号 getContext

android - 如何解释调试信息?

android - 如何在不抬起手指的情况下撤销 `requestDisallowInterceptTouchEvent(false)`(Action.UP 或 Cancel)?

android - 在手机上安装后无法运行应用程序