android.view.WindowManager $ BadTokenException: невозможно добавить окно - на Toast - PullRequest
0 голосов
/ 04 октября 2018

Когда я часто выполняю какие-либо действия (по моим предположениям, из-за сообщения Toast) в моем приложении для Android, появляется ошибка ниже. Не удается найти точное местоположение этой проблемы. Могу ли я получить помощь от кого-то, чтобы разрешить то же самое?

 --------- beginning of crash
10-04 16:13:49.250 6541-6541/com.test.myapp E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.test.myapp, PID: 6541
    android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@e2815e is not valid; is your activity running?
        at android.view.ViewRootImpl.setView(ViewRootImpl.java:679)
        at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:342)
        at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
        at android.widget.Toast$TN.handleShow(Toast.java:459)
        at android.widget.Toast$TN$2.handleMessage(Toast.java:342)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6119)
        at java.lang.reflect.Method.invoke(Native Method) 

Примечания: Этот сбой происходит не всегда.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Перед передачей Context в тост, вы всегда должны проверять правильность контекста, который вы собираетесь использовать.В моих приложениях я использую метод проверки контекста, который я сделал:

public static boolean isContextValid(Context context, Fragment fragment) {
    if (context instanceof Activity) {
        Activity activity = (Activity) context;
        if (activity.isFinishing() || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && activity.isDestroyed())) {
            return false;
        }
    }

    return context != null && (fragment == null || (fragment.isAdded() && !fragment.isRemoving());
}

Вы можете передать только контекст, или также Fragment, если ваш текущий контекст является фрагментом.Этот метод проверяет, является ли контекст Activity, в этом случае мы проверяем, заканчивается ли действие / уничтожено.

Если вы хотите отобразить тост после жизненного цикла фрагмента, также перейдите к методу, который вы используете в текущем фрагменте, чтобы мы могли определить, является ли фрагмент все еще видимым и прикрепленным к действию.

BONUS ANDROID 7.1

В API 25 этого недостаточно, и иногда устройство по-прежнему аварийно завершает работу с предоставленной вами трассировкой стека.

Этот репозиторий может бытьрешение, поскольку оно оборачивает ошибочный вызов в предложение try / catch.Конечно, это не лучшая вещь, но, по крайней мере, она решает эту досадную ошибку для устройств 7.1.

0 голосов
/ 04 октября 2018

android.view.WindowManager $ BadTokenException: невозможно добавить окно - токен android.os.BinderProxy@e2815e недействителен;ваша деятельность запущена?

В этой строке вы увидите, что ваша активность может не выполняться во время попытки показать тост.

Если выпоказывая тост в активности, подобной этой,

Toast toast = Toast.makeText(this, R.string.message, Toast.LENGTH_LONG).show();

, вы должны знать, что пытаетесь отобразить его в контексте действия, устанавливая первый аргумент «this» и, таким образом, если вы закончите();ваша деятельность до этой линии, вы получите это исключение.Поэтому я предлагаю проверить, так ли это, или, может быть, вместо этого вы можете использовать контекст приложения:

Toast toast = Toast.makeText(getApplicationContext(), R.string.message, Toast.LENGTH_LONG).show();

Надеюсь, это полезно!

...