Home » Android » java – Fatal Exception: android.view.WindowManager$BadTokenException Unable to add window — token is not valid; is your activity running?

java – Fatal Exception: android.view.WindowManager$BadTokenException Unable to add window — token is not valid; is your activity running?

Posted by: admin June 15, 2020 Leave a comment

Questions:

I know this question is discussed several time but believe me i never got any answer working.
In my Main Activity i have used few Dialog to inform user about some operations but i get this specific error mostly (specifically 96%) on Xiaomi devices.
`

Fatal Exception: android.view.WindowManager$BadTokenException
Unable to add window -- token [email protected] is not valid; is your activity running?
android.view.ViewRootImpl.setView (ViewRootImpl.java:697)
android.view.WindowManagerGlobal.addView (WindowManagerGlobal.java:347)
android.view.WindowManagerImpl.addView (WindowManagerImpl.java:94)
android.widget.Toast$TN.handleShow (Toast.java:463)
android.widget.Toast$TN$2.handleMessage (Toast.java:346)
android.os.Handler.dispatchMessage (Handler.java:102)
android.os.Looper.loop (Looper.java:163)
android.app.ActivityThread.main (ActivityThread.java:6377)
java.lang.reflect.Method.invoke (Method.java)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:904)

com.android.internal.os.ZygoteInit.main (ZygoteInit.java:794)

I covered each Dialog Show method like

if (!MainActivityNew.this.isFinishing())
dialogDownload.show();

`
But still i am getting this error in release mode mostly on Xiaomi Devices
With Android Version 7, Please help me i stuck on this problem from past one month.

Here is some data from firebase Crashlytics

Devices
100% Xiaomi
Operating systems
100% Android 7
Device states
4% background

How to&Answers:

This problem is not because of Dialog but with Toast. Mainly this Toast issue is in android 7.1 version where the context become null. There is a solution created by this gentleman Solution . I have tested and this is working very well. You can try this.

 if (android.os.Build.VERSION.SDK_INT == 25) {
                ToastCompat.makeText(context, message, Toast.LENGTH_SHORT)
                        .setBadTokenListener(toast -> {
                            Log.e("failed toast", message);
                        }).show();
            } else {
                Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
            }

Answer:

Use Asynctask or Handler
like:

Use private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message message) {
switch (message.what) {
  case DISPLAY_DLG:
    if (!isFinishing()) {
    dialogDownload.show();
    }
    break;
  }
 }
};