2012-03-02 3 views
69

私はフェイスブックに接続しようとするが、FacebookのAPIをthrought、私はこの例に従います。https://github.com/facebook/facebook-android-sdk/tree/master/examples/simpleウィンドウを追加できません - トークンandroid.os.BinderProxyは無効です。あなたの活動は実行されていますか?

すべてがOKですが、私はいくつかのコードを編集しようとすると、私は、ログインが成功した後、私は、ダイアログポストメッセージを表示したいわけこのように:

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 [email protected] 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) 

任意のアイデア?

+0

[エラーの可能性の重複:45d459c0 @ BinderProxyが有効ではありません。あなたの活動は実行中ですか?](http://stackoverflow.com/questions/7811993/error-binderproxy45d459c0-is-not-valid-is-your-activity-running) – bsara

+1

以下の答えを確認してください。私はそれが正しいことをマークしました:) –

+0

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

答えて

90

これは、存在しなくなったコンテキストのダイアログを表示しているときに発生します。よくあるケース - 'show dialog'操作が非同期操作の後で、その操作中に元のアクティビティ(つまり、ダイアログの親になる)が破棄されます。良い説明については、このブログの記事やコメントを参照してください。

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

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

これは私のアプリで報告されているのを見たとき、かなり珍しく、ブログ記事の経験とマッチします。アクティビティに何かが間違っていた/ AsyncTaskの作業中に破棄されました。あなたの変更が毎回どのようにこの結果になるかはわかりませんが、あなたのコードが実行されるまでに常に破棄されるダイアログのコンテキストとしてアクティビティを参照しているのでしょうか?

Check whether activity is active

+0

私の問題は解決されませんでしたが、うまくガイドされました! –

+2

'dialog.show()'を呼び出さないと問題は解決しますが、ダイアログを表示するにはどうしたらいいですか? – natsumiyu

99

私はこのエラーを見ていた。また

、私はこれはあなたの活動が実行されている場合伝えるための最善の方法であるのかはわからないが、そうすることのいずれかの方法でこの答えを見ます私のアプリケーションの一部からたまに報告されており、ここでは私のためにそれを解決したものです:

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

そこに他のすべての答えは、活動を実行しているのリストを反復処理のような奇妙なことをやっているように見えるが、これはありますはるかに簡単で、リック。

+3

これは問題を解決しないので、クラッシュを防ぎ、ダイアログも表示します – YTerle

+2

'context instanceof Activity'をチェックするか、' Exception'を取得する必要があります。 – FtheBuilder

+2

またはgetActivity()を使用することができます。コンテキストの代わりにisFinishing()を使用します –

3

This websiteリスト特定Activityを実行し、あなたを助けるためにコードスニペットを提供しているかどうかをチェックする3つの異なる方法。ただし、アクティビティがまだ実行中であるかどうかを確認することは、がデバッグのためにアドバイスされただけです。の目的は、結果がコード/ロジックフローには適していないためです。

+0

リンクの背後にあるものを教えてください。 – Antek

2

私はまったく同じ問題に直面しました。 '(!isFinishing())'を呼び出すとクラッシュは防止されましたが、 '警告'メッセージが表示されませんでした。

それから、私は、機能が'static'というアラートが表示されている場所で呼び出してみました。その後、クラッシュは発生せず、メッセージも表示されます。EXのために

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

あなたはアクティビティ内静的変数を使用することができます。 isActivityLiveがの場合はとなり、メソッドを呼び出します。

class MyActivity extends Activity { 
    static boolean isActivityLive = false; 

     @Override 
     public void onStart() { 
     super.onStart(); 
     isActivityLive = true; 
     } 

     @Override 
     public void onStop() { 
     super.onStop(); 
     isActivityLive = false; 
     } 
} 
関連する問題