0

I have a report of badtokenexception and I am not being able to reproduce it despite anything I try and it is not clear for me how it can happen.

BadTokenException (@android.view.ViewRootImpl:setView:575) via (@android.view.WindowManagerGlobal:addView:272) FULL TRACE: android.view.WindowManager$BadTokenException: Unable to add window – token android.os.BinderProxy@e5346b6 is not valid; is your activity running? at android.view.ViewRootImpl.setView(ViewRootImpl.java:575) at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:272) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) at 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) at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(SourceFile:1740) at android.support.v4.app.FragmentManagerImpl.moveToState(SourceFile:1809) at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(SourceFile:3217) at android.support.v4.app.FragmentManagerImpl.dispatchStart(SourceFile:3176) at android.support.v4.app.FragmentController.dispatchStart(SourceFile:203) at android.support.v4.app.FragmentActivity.onStart(SourceFile:562) at android.support.v7.app.AppCompatActivity.onStart(SourceFile:177) at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1220) at android.app.Activity.performStart(Activity.java:5993) at android.app.Activity.performRestart(Activity.java:6050) at android.app.ActivityThread.handleWindowVisibility(ActivityThread.java:3453) at android.app.ActivityThread.access$1200(ActivityThread.java:148) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5272) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)

I have an activity that shows a dialog when starting, usually it works, only a few crashes are being reported on analytics.

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();
    }

Do you have some hint how a badtokenexception could happen? The only thing I can think of if when the activity gets closed before ft.commit() is called, so I tried calling finish() before but this did not change anything. Some ideas?

David
  • 3,971
  • 1
  • 26
  • 65

1 Answers1

0

You can check if the activity is finishing with isFinishing() method.

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();
        }
    }
Ariel Carbonaro
  • 1,529
  • 1
  • 13
  • 25
  • I tried that, but how to test it? As I said I tried calling finish before commit and so on, but isFinishing would return false. Also is it really possible that pressing the back button for example is handled by this activity before onCreate completed so that this exception will happen? – David Nov 23 '17 at 14:30
  • @David I think that calling finish before commit is not a good way to test it, check https://stackoverflow.com/questions/8282569/oncreate-flow-continues-after-finish – Ariel Carbonaro Nov 23 '17 at 18:05
  • I added isFinishing a long time ago to the production code and could detect now still the same crashes. – David Oct 16 '18 at 14:00