Неустранимое исключение: android.view.WindowManager$BadTokenException Невозможно добавить окно - токен недействителен; ваша деятельность работает?
Я знаю, что этот вопрос обсуждался несколько раз, но поверьте мне, я так и не получил никакого ответа. В своей основной деятельности я использовал несколько диалогов, чтобы информировать пользователя о некоторых операциях, но я получаю эту конкретную ошибку в основном (в частности, 96%) на устройствах Xiaomi. `
Fatal Exception: android.view.WindowManager$BadTokenException
Unable to add window -- token android.os.BinderProxy@f839de9 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();
`Но все же я получаю эту ошибку в режиме релиза, в основном на устройствах Xiaomi с Android версии 7, пожалуйста, помогите мне, я застрял на этой проблеме с прошлого месяца.
Вот некоторые данные из Firebase Crashlytics
Устройства 100% Xiaomi Операционные системы 100% Android 7 Состояние устройства 4% фона
2 ответа
Эта проблема не из-за диалога, а из-за тоста. Главным образом эта проблема Toast в версии Android 7.1, где контекст становится нулевым. Есть решение, созданное этим джентльменом. Решение. Я проверил, и это работает очень хорошо. Вы можете попробовать это.
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();
}
Используйте Asynctask или Handler, например:
Use private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message message) {
switch (message.what) {
case DISPLAY_DLG:
if (!isFinishing()) {
dialogDownload.show();
}
break;
}
}
};