【问题标题】:BadTokenException Unable to add windowBadTokenException 无法添加窗口
【发布时间】:2014-04-12 16:02:27
【问题描述】:

我在 Android 市场上发布了一个应用程序。我已经在 HTC 和三星测试过,它工作正常。但是今天我的应用程序出现如下错误。

android.view.WindowManager$BadTokenException
Source method 
ViewRoot.setView()

在堆栈跟踪中,

android.view.WindowManager$BadTokenException: Unable to add window -- token
android.os.BinderProxy@4059be38 is not valid; is your activity running?
at android.view.ViewRoot.setView(ViewRoot.java:532)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:200)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:114)
at android.view.Window$LocalWindowManager.addView(Window.java:424)
at android.app.Dialog.show(Dialog.java:241)
at android.app.AlertDialog$Builder.show(AlertDialog.java:810)
at com.newtglobal.android.Trace.serverBusy(Trace.java:1041)
at com.newtglobal.android.Trace.access$12(Trace.java:1013)
at com.newtglobal.android.Trace$13$1.run(Trace.java:975)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)

对于包含混淆代码的应用程序,堆栈跟踪包含混淆符号名称。如果应用程序使用 ProGuard 进行了混淆,您可以使用 Android SDK Tools r8 及更高版本中包含的“retrace”工具对堆栈跟踪进行解混淆。有关详细信息,请参阅 ProGuard 文档。

有什么问题。如何摆脱这个错误??? 但是我在HTC和三星都测试过,效果很好。

【问题讨论】:

    标签: android android-view android-alertdialog android-windowmanager


    【解决方案1】:

    我的应用遇到了非常相似的问题;从一些研究来看,您似乎想确保在创建 AlertDialog(而不是应用程序上下文)时使用的是 Activity 上下文,并且还想确保您使用的是最顶层的父 Activity(查看更多关于已接受此帖子的答案:https://stackoverflow.com/a/4011090/202870)。

    【讨论】:

      【解决方案2】:
      @Override
      public void onCreate(Bundle savedInstanceState) {
          // do all your other stuff here
      
          new Handler().postDelayed(new Runnable() {
              @Override
              public void run() {
                  mProgressDialog = ProgressDialog.show(
                     MyActvity.this.getApplicationContext(), "",
                     MyActvity.this.getString(R.string.loading), true);
      
                  // start time consuming background process here
              }
          }, 1000); // starting it in 1 second
      }
      

      【讨论】:

        【解决方案3】:

        “BadTokenException Unable to add window”在 Android 中可能会出现很多次。

        “弹出窗口”或“对话框”等许多视图需要父视图/活动才能启动。 在任何情况下,如果您的父视图尚未初始化,但调用了依赖于它的视图,则会抛出 BadTokenException。

        为避免这种情况,您首先需要确保父视图已附加到电话窗口。 对于活动,可以使用 'onActivityAttached' 或 'onAttachedToWindow()' 等来完成。 然后调用您的子视图,它应该可以正常工作。

        如果活动或父视图已附加,则使用它自己的上下文而不是 getAppliationContext()。

        如果它在 Activity 类本身中,您可以传递相同的对象 (this/CLASS_NAME.this)。

        对于您的情况,我认为调用 setView 时,它没有获取父视图。 或者传递活动的上下文。

        这将如何帮助/

        快乐编码。 :)

        【讨论】:

          猜你喜欢
          • 2013-08-26
          • 1970-01-01
          • 2013-09-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-09
          • 1970-01-01
          相关资源
          最近更新 更多