Android:有时/某些设备上只有两个错误

时间:2010-12-06 15:33:40

标签: android crash

我刚刚将我的第一个应用程序发布到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()没有...... :(

4 个答案:

答案 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才能添加视图