BadTokenException 无法添加窗口

3

我在安卓市场上发布了一款应用。我已经在HTC和三星手机上进行了测试,它的表现很好。但今天我在我的应用程序中遇到了下面的错误。

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

在 Stack trace 中,

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进行混淆,则可以使用“retrace”工具(包含在Android SDK Tools r8及更高版本中)来取消混淆堆栈跟踪。有关更多信息,请参阅ProGuard文档。

问题是什么?如何解决这个错误?但我已经在HTC和三星上测试过了,它运行得很好。

3个回答

2

我遇到了一个非常类似的应用程序问题;通过一些研究,看起来您需要确保在创建AlertDialog时使用Activity Context(而不是Application Context),并且还要确保使用最上层的父Activity(有关此帖子的接受答案的更多信息,请参见: https://dev59.com/V0_Ta4cB1Zd3GeqPEuA_#4011090)。


0

"BadTokenException Unable to add window" 在 Android 中可能会发生多次。

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

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

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

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

对于您的情况,我认为当 setView 被调用时,它没有获取到父视图。 否则,请传递活动的上下文。

希望这能帮到您。

祝编码愉快。 :)


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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接