【问题标题】:Android: two error only sometimes/on some devicesAndroid:仅有时/在某些设备上出现两个错误
【发布时间】:2010-12-06 15:33:39
【问题描述】:

我刚刚将我的第一个应用程序发布到 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() - 它不会在模拟器或我的物理设备上崩溃。但它似乎有时会“在野外”崩溃。

找到原因的第一步是什么?

非常感谢,

斯蒂芬

编辑:

@Override
protected void onPreExecute() {
  this.dialog.setMessage(((Activity) listener).getString(R.string.daten_werden_geladen));
  this.dialog.show();
}

this.dialog.setMessage 有效,但 show() 不... :(

【问题讨论】:

    标签: android crash


    【解决方案1】:

    看起来您正在使用已关闭活动的上下文更新 UI 或显示来自 onPreExecute() 的对话框。我猜你的任务实现中有一个逻辑错误。你应该在你使用上下文更新 UI 之前检查活动是否正在运行,或者你是否持有来自活动的视图的引用。

    编辑: 尝试使用应用程序的上下文,而不是使用 Activity 的上下文来获取字符串资源。

    this.dialog.setMessage(((Activity) listener).getApplicationContext().getString(R.string.daten_werden_geladen));
    

    【讨论】:

    • 嗨 Varun,非常感谢您的回答,我会尝试的。但是您知道为什么它似乎只是有时会崩溃吗?我很伤心,只有一种可能到达那里;那里有很多测试人员,而且它总是有效的;尽管如此,我还是收到了堆栈跟踪的错误消息...
    • 如果你正在从任务中建立一个 http 连接,并且有时可能需要更多时间来建立连接。此外,如果您在任务中持有对上下文对象的引用,那么您可以尝试使用当前上下文更新它。
    • 但是错误发生在onPreExecute-method,HTTP-connection是稍后建立的:在doInBackground... :(
    • varun 是完全正确的...在您的 onPreExecute 开始运行之前,您的 Activity 已经消失,并且您在 asnctask 中持有对已死活动的引用。试着在异步任务开始的时候改变手机的方向,我敢打赌你可以用这种方式重现它。
    • Reuben Scratton 对方向变化有一个很好的观点,它可能是瞬间计时的情况,但它可能发生。
    【解决方案2】:

    在我看来,您的活动尚未运行(或如前所述已消失)

    这可能取决于线程的执行方式以及应用程序的生命周期在所有 Android 版本上并不完全相同,我会尝试在至少 1.6、2.1 和 2.2 的模拟器中复制它。此外,市场报告可能会告诉您它是否仅发生在特定设备中。

    如果某些制造商更改影响了 Activity 生命周期的执行方式,我不会感到惊讶。我会尝试至少在 HTC Sense 设备上进行检查,也许在一些 LG、三星或摩托罗拉上进行检查,因为它们都在 android 之上进行了一些 UI 调整。

    一个可能的解决方案(但这只是一个 hack 并没有解决问题)是使用 postDelayed 延迟该代码的执行,这样做您可以确定它会在几毫秒后进入 UI 线程。正如我所说,它不会攻击问题的根源,但它可能会使其消失。

    【讨论】:

      【解决方案3】:

      swalkner,看来您需要注意应用程序中的配置更改。检查this

      【讨论】:

        【解决方案4】:

        我们不能使用getApplicationContext()来获取上下文,我们必须使用活动来获取上下文。因为只有活动才能添加视图

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多