ウィンドウを追加できません—トークンandroid.os.BinderProxyが無効です。あなたの活動は実行されていますか?


116

私はFacebook APIを介してFacebookに接続しようとしています。次の例に従います:https : //github.com/facebook/facebook-android-sdk/tree/master/examples/simple

すべてが大丈夫ですが、コードを編集しようとすると、次のように、ログインが成功した後にダイアログ投稿メッセージを表示したいと思います。

public void onAuthSucceed() {
        mText.setText("You have logged in! ");   
        //This is the code to call the post message dialog.                     
        mFacebook.dialog(Example.this, "feed",new SampleDialogListener());   
    }

私はlogcatでこのエラーを受け取ります:

03-02 13:32:08.629: E/AndroidRuntime(14991): android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@405180f8 is not valid; is your activity running?
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.view.ViewRoot.setView(ViewRoot.java:532)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.view.Window$LocalWindowManager.addView(Window.java:424)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.app.Dialog.show(Dialog.java:241)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at com.facebook.android.Facebook.dialog(Facebook.java:780)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at com.facebook.android.Facebook.dialog(Facebook.java:737)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at com.facebook.android.Example$SampleAuthListener.onAuthSucceed(Example.java:113)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at com.facebook.android.SessionEvents.onLoginSuccess(SessionEvents.java:78)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at com.facebook.android.Example$LoginDialogListener.onComplete(Example.java:88)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at com.facebook.android.Facebook$1.onComplete(Facebook.java:320)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at com.facebook.android.FbDialog$FbWebViewClient.shouldOverrideUrlLoading(FbDialog.java:144)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.webkit.CallbackProxy.uiOverrideUrlLoading(CallbackProxy.java:218)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:337)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.os.Handler.dispatchMessage(Handler.java:99)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.os.Looper.loop(Looper.java:130)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at android.app.ActivityThread.main(ActivityThread.java:3687)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at java.lang.reflect.Method.invokeNative(Native Method)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at java.lang.reflect.Method.invoke(Method.java:507)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
03-02 13:32:08.629: E/AndroidRuntime(14991):    at dalvik.system.NativeStart.main(Native Method)

何か案が?



1
以下の答えを確認してください。正しいとマークしました:)
Han Tran

回答にマークを付けたからといって、これが重複した質問であるという事実は変わりません。もう1つは最初に尋ねられたもので、本質的に同じ答えを持つ同じ問題です。
bsara 2014

1
私の質問が2年前であることをご存知ですか?
Han Tran

1
だから、他のモデレーターが間違っているように見えますが、あなた:))アン、ありがとう!
Han Tran

回答:


127

これは、存在しないコンテキストのダイアログを表示しているときに発生する可能性があります。一般的なケース-「ダイアログの表示」操作が非同期操作の後であり、その操作中に元のアクティビティ(つまり、ダイアログの親になる)が破棄されます。適切な説明については、次のブログ投稿とコメントを参照してください。

http://dimitar.me/android-displaying-dialogs-from-background-threads/

上記のスタックトレースから、facebookライブラリがauth操作を非同期にスピンオフし、このシナリオを簡単に作成できるハンドラー-コールバックメカニズム(リスナーで呼び出されたonComplete)があることがわかります。

これが私のアプリで報告されたのを見たとき、それはかなりまれで、ブログ投稿の経験と一致します。アクティビティに問題が発生しました/ AsyncTaskの作業中に破棄されました。変更が毎回どのように発生するかはわかりませんが、コードの実行時に常に破棄されるダイアログのコンテキストとしてアクティビティを参照しているのではないでしょうか。

また、これがあなたの活動が実行されているかどうかを確認する最良の方法であるかどうかはわかりませんが、そのための1つの方法については、この回答を参照してください。

アクティビティがアクティブかどうかを確認する


3
呼び出しdialog.show()を行わなくても問題は解決しますが、ダイアログを表示できるようにするための回避策は何ですか?
natsumiyu

私にとっては、Fragment.getContext()21を超えるAPIで機能するを呼び出しています。ただし、Lollipopではクラッシュします
TheRealChx101

158

一部のアプリからこのエラーがときどき報告されるのを目にしていましたが、これが私のためにそれを解決したものです:

if(!((Activity) context).isFinishing())
{
    //show dialog
}

そこに出ている他のすべての答えは、実行中のアクティビティのリストを反復するような奇妙なことをしているようですが、これははるかに単純でトリックを実行するようです。


6
それは問題を解決しません、それはクラッシュを防ぎ、同様にダイアログを表示します
YTerle

6
確認するcontext instanceof Activity必要があることを忘れないでください。そうしないと、Exception
FtheBuilder 2016年

3
または、コンテキストの代わりにgetActivity()。isFinishing()を使用できます
Nikita Axyonov

API-23を使用しています。AppCompatActivityを拡張するMainActivityでこれを使用しようとすると、「原因:java.lang.ClassCastException:com.creativeapp.hindihdvideosongs.AppController can be cast to android.app.Activity at com.creativeapp.hindihdvideosongs.MainActivity.onCreate(MainActivity.java:145)AppController is私のAndroidMenifestに追加
pavel

私は対話を使用しておらず、このエラーが発生しています。
Abdul Waheed

10

簡単な回避策の1つは、例外をキャッチすることです。

try {
        alertDialog.show()
    }
catch (WindowManager.BadTokenException e) {
        //use a log message
    }

エレガントではありませんが、非同期操作を管理する必要があり、ダイアログを表示するときにアクティビティがアップしているかどうかがわからない場合は、簡単な場合があります。


とても醜くてとても美しい!
Rahul Tiwari

8
  • 私の場合、onPostExecuteAsyncTaskでダイアログボックスを開いたり表示したりしようとしているために問題が発生しました

  • しかし、その方法が間違っているshowing dialogか、Uiがで変更されていonPostExecuteます。

  • そのためには、アクティビティがアクティブになっていることを確認する必要があります。例: !isFinishing()アクティビティが完了していない場合は、ダイアログボックスまたはUIの変更のみを表示できます。

    @Override
    protected void onPostExecute(String response_str) {
    
       getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if (!((Activity) mContext).isFinishing()) {
                            try {
                                ShowAgilDialog();
                            } catch (WindowManager.BadTokenException e) {
                                Log.e("WindowManagerBad ", e.toString());
                            }
                        }
                    }
                });
    }

1

私はまったく同じ問題に直面しました。呼び出し'(!isFinishing())'はクラッシュを防ぎましたが、「アラート」メッセージを表示できませんでした。

次に、アラートが表示される呼び出し関数を「静的」にしてみました。その後、クラッシュは発生せず、メッセージも表示されます。

例:

public static void connect_failure() {      
        Log.i(FW_UPD_APP, "Connect failed");

        new AlertDialog.Builder(MyActivity)
        .setTitle("Title")
        .setMessage("Message")
        .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) { 
                  //do nothing
            }
         })
        .setIcon(R.drawable.the_image).show();      
    }


1

別の開発者の使用例:WindowManageror getWindow()onCreate()or onStart()またはonResume()で呼び出されている場合、a BadTokenExceptionがスローされます。ビューが準備されてアタッチされるまで待つ必要があります。

コードを移動してonAttachedToWindow()解決します。それは永続的な解決策ではないかもしれませんが、私がテストできる限り、それは常に機能しました。

私の場合、アクティビティが表示されたときに画面の明るさを上げる必要がありました。結果の行getWindow().getAttributes().screenBrightnessonResume()例外が発生しました。機能するようにコードを移動しますonAttachedToWindow()


0

私はそれらのメソッドにstatic関連するプロパティがあるので、DialogHelper.classメソッド(ダイアログの作成と非表示を担当)のプロパティを削除するだけで修正されましたWindow


0

dependencyServicesの下では、上記のいずれも私を助けませんでした、私は以下のようにしてしまいました:

    class Static_Toast_Android
    {
        private static Context _context
        {
            get { return Android.App.Application.Context; }
        }
        public static void StaticDisplayToast(string message)
        {
            Toast.MakeText(_context, message, ToastLength.Long).Show();
        }
    }
    public class Toast_Android : IToast
    {

        public void DisplayToast(string message)
        {
            Static_Toast_Android.StaticDisplayToast(message);
        }
    }

インターフェイスを静的にすることはできないため、「ダブルクラス」を使用する必要があります。L-


0

ウィンドウを追加できません-トークンが無効です。あなたの活動は実行されていますか?

このクラッシュは通常、以前に完了したアクティビティをコンテキストとして使用してダイアログを表示しようとするアプリが原因で発生します。たとえば、アクティビティが完了したときにダイアログを表示しようとするAsyncTaskをトリガーしたが、タスクが完了する前にユーザーがアクティビティから戻った場合に、これが発生する可能性があります。

外部リソース

Android –バックグラウンドスレッドからのダイアログの表示

エラー:BinderProxy @ 45d459c0は無効です。あなたの活動は実行されていますか?


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.