BadTokenException无法添加窗口

时间:2012-01-19 07:44:24

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

我在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及更高版本中包含的“回扫”工具对堆栈跟踪进行模糊处理。有关详细信息,请参阅ProGuard文档。

问题是什么?如何摆脱这个错误? 但我已经在HTC和三星测试过,它工作正常。

3 个答案:

答案 0 :(得分:2)

我的应用程序与我的问题非常相似;从某些研究来看,您希望确保在创建AlertDialog(而不是应用程序上下文)时使用活动上下文,并且还要确保使用最顶层的父活动(请参阅接受了这篇文章的回答:https://stackoverflow.com/a/4011090/202870)。

答案 1 :(得分:0)

@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
}

答案 2 :(得分:0)

" BadTokenException无法添加窗口"在Android中可能会发生很多次。

许多观点,例如'弹出窗口'或者'对话框'需要父视图/活动才能启动。 如果在任何情况下,您的父视图仍未初始化,但调用依赖于它的视图,则抛出BadTokenException。

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

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

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

对于你的情况,我认为当调用setView时,它没有获得父视图。 或者传递活动的背景。

这将如何帮助/

快乐编码。 :)