【问题标题】:BadTokenException not clear whyBadTokenException 不清楚为什么
【发布时间】:2017-11-23 22:17:08
【问题描述】:

我收到了关于 badtokenexception 的报告,尽管我尝试了任何方法都无法重现它,而且我不清楚它是如何发生的。

BadTokenException (@android.view.ViewRootImpl:setView:575) 通过 (@android.view.WindowManagerGlobal:addView:272) 完整跟踪:android.view.WindowManager$BadTokenException:无法添加窗口 - 令牌 android.os。 BinderProxy@e5346b6 无效;您的活动正在运行吗?在 android.view.ViewRootImpl.setView(ViewRootImpl.java:575) 在 android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:272) 在 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) 在 android.app。 Dialog.show(Dialog.java:306) at android.support.v4.app.DialogFragment.onStart(SourceFile:416) at android.support.v4.app.Fragment.performStart(SourceFile:2369) at android.support.v4 .app.FragmentManagerImpl.moveToState(SourceFile:1458) 在 android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(SourceFile:1740) 在 android.support.v4.app.FragmentManagerImpl.moveToState(SourceFile:1809) 在 android.support。 v4.app.FragmentManagerImpl.dispatchStateChange(SourceFile:3217) 在 android.support.v4.app.FragmentManagerImpl.dispatchStart(SourceFile:3176) 在 android.support.v4.app.FragmentController.dispatchStart(SourceFile:203) 在 android.support .v4.app.FragmentActivity.onStart(SourceFile:562) 位于 android.a 的 android.support.v7.app.AppCompatActivity.onStart(SourceFile:177) pp.Instrumentation.callActivityOnStart(Instrumentation.java:1220) 在 android.app.Activity.performStart(Activity.java:5993) 在 android.app.Activity.performRestart(Activity.java:6050) 在 android.app.ActivityThread.handleWindowVisibility (ActivityThread.java:3453) 在 android.app.ActivityThread.access$1200(ActivityThread.java:148) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317) 在 android.os.Handler.dispatchMessage(Handler .java:102) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5272) 在 java.lang.reflect.Method.invoke(Native Method) 在java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909) 在 com.android.internal.os.ZygoteInit.main( ZygoteInit.java:704)

我有一个在启动时显示对话框的活动,通常它可以工作,分析时只报告了几次崩溃。

public class DialogFragmentWrapperActivity extends AppCompatActivity {

    /** Stores an instance of the dialog to be shown. */
    private CustomDialogFragment mCustomDialog = null;

    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        String fragmentId = "DialogFragmentWrapperActivity" + String.valueOf(this.hashCode());
        if ((savedInstanceState != null) && savedInstanceState.containsKey("id")) {
            fragmentId = savedInstanceState.getString("id");
        }
        mCustomDialog = CustomDialogFragment.newInstance(fragmentId);

        final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.add(mCustomDialog, fragmentId);
        ft.commit();
    }

你有什么提示 badtokenexception 是如何发生的吗?如果在调用 ft.commit() 之前关闭活动,我唯一能想到的,所以我之前尝试调用 finish() 但这并没有改变任何东西。有什么想法吗?

【问题讨论】:

    标签: android


    【解决方案1】:

    您可以使用isFinishing() 方法检查活动是否完成。

    public class DialogFragmentWrapperActivity extends AppCompatActivity {
    
        /** Stores an instance of the dialog to be shown. */
        private CustomDialogFragment mCustomDialog = null;
    
        @Override
        public void onCreate(final Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            String fragmentId = "DialogFragmentWrapperActivity" + String.valueOf(this.hashCode());
            if ((savedInstanceState != null) && savedInstanceState.containsKey("id")) {
                fragmentId = savedInstanceState.getString("id");
            }
            mCustomDialog = CustomDialogFragment.newInstance(fragmentId);
    
            final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.add(mCustomDialog, fragmentId);
            if(!isFinishing()){
               ft.commit();
            }
        }
    

    【讨论】:

    • 我试过了,但是如何测试呢?正如我所说,我尝试在提交之前调用完成等等,但是 isFinishing 会返回 false。在 onCreate 完成之前,这个活动是否真的有可能按下后退按钮,这样就会发生这个异常?
    • @David 我认为在提交之前调用完成并不是一个很好的测试方法,检查stackoverflow.com/questions/8282569/…
    • 我很久以前在生产代码中添加了 isFinishing,现在仍然可以检测到同样的崩溃。
    猜你喜欢
    • 2015-06-10
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多