3

我在 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 和三星测试过,它工作正常。

4

3 回答 3

2

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

于 2012-02-08T17:31:10.743 回答
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
}
于 2013-05-07T13:47:28.553 回答
0

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

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

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

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

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

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

这将如何帮助/

快乐编码。:)

于 2014-04-12T07:51:29.860 回答