web-dev-qa-db-ja.com

android.view.WindowManager $ BadTokenException:ウィンドウを追加できません-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) 

注:このクラッシュは常に発生するとは限りません。

9
kavie

ContextをToastに渡す前に、使用するコンテキストの有効性を常に確認する必要があります。私のアプリケーションでは、私が作成したコンテキストチェッカーメソッドを使用します。

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であるかどうかをチェックします。この場合、アクティビティが終了/破棄されているかどうかをチェックします。

フラグメントのライフサイクルに続いてトーストを表示する場合は、現在のフラグメントのメソッドにも渡して、フラグメントがまだ表示され、アクティビティにアタッチされているかどうかを確認できるようにします。

ボーナスAndroid 7.1

API 25では、これでは不十分であり、指定したスタックトレースでデバイスがクラッシュすることがあります。

このリポジトリ は、誤った呼び出しをtry/catch句でラップするため、解決策になる可能性があります。もちろん、これは最善の方法ではありませんが、少なくとも7.1デバイスのこの厄介なクラッシュを解決します。

3
fillobotto

Android.view.WindowManager $ BadTokenException:ウィンドウを追加できません-トークンAndroid.os.BinderProxy@e2815eは無効です。あなたの活動は実行されていますか?

この行では、トーストを表示しようとしているときにアクティビティが実行されていない可能性があることを示唆しています。

このようなアクティビティでトーストを表示している場合は、

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

最初の引数を「this」に設定し、この方法でfinish()を実行すると、アクティビティのコンテキストで表示しようとしていることに注意してください。この行の前のアクティビティでは、その例外が発生します。したがって、これが当てはまるかどうかを確認することをお勧めします。または、代わりにアプリケーションのコンテキストを使用することもできます。

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

これがお役に立てば幸いです。

0
Onur D.