我刚刚将我的第一个应用程序发布到Google Marketplace并收到了应用程序崩溃的信息 - 我有两个堆栈跟踪,其中一个例如:
android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@45681318 is not valid; is your activity running?
at android.view.ViewRoot.setView(ViewRoot.java:468)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
at android.view.Window$LocalWindowManager.addView(Window.java:424)
at android.app.Dialog.show(Dialog.java:239)
at abc.de.f.MyTask.onPreExecute(MyTask.java:52)
只有一种可能性在MyTask中获取方法onPreExecute() - 并且它不会在模拟器或物理设备上崩溃。但它似乎有时会“在野外”崩溃。
你的第一步是什么才能找到原因?
非常感谢,
Stefan
编辑:
@Override
protected void onPreExecute() {
this.dialog.setMessage(((Activity) listener).getString(R.string.daten_werden_geladen));
this.dialog.show();
}
this.dialog.setMessage有效,但show()没有...... :(
答案 0 :(得分:5)
看起来您正在使用已关闭的活动的上下文更新UI或从onPreExecute()显示对话框。我想你的任务实现中存在逻辑错误。在使用上下文更新UI之前,或者如果您持有对活动中的视图的引用,U应检查活动是否正在运行。
编辑: 不使用Activity的上下文来获取字符串资源,而是尝试使用应用程序的上下文。
this.dialog.setMessage(((Activity) listener).getApplicationContext().getString(R.string.daten_werden_geladen));
答案 1 :(得分:0)
在我看来,您的活动尚未运行(或已如前所述已经消失)
它可能取决于线程的执行方式以及应用程序的生命周期在所有Android版本上都不完全相同,我会尝试在1.6,2.1和2.1版本的模拟器中复制它。 2.2至少。此外,市场报告可能会告诉您它是否只发生在特定设备中。
如果某些制造商的更改影响了活动生命周期的执行方式,我不会感到惊讶。我尝试至少在HTC Sense设备上检查,也许在某些LG,三星或摩托罗拉上检查,因为它们都在Android上进行了一些UI调整。
一种可能的解决方案(但它只是一个黑客并且没有解决问题)是使用postDelayed延迟执行该代码,通过这样做,你确定它会在一些ms之后进入UI线程。正如我所说,它不会攻击问题的根源,但它可能会使它消失。
答案 2 :(得分:0)
swalkner,您似乎需要在应用中处理配置更改。检查this
答案 3 :(得分:0)
我们无法使用getApplicationContext()
来获取上下文,我们必须使用activity来获取Context。因为只有activity才能添加视图