2012-03-16 11 views
2

私はAndroidのAndroidアプリからログインしてユーザーの壁に投稿するFacebook Android SDKを使用しています。 Facebookの投稿ルーチンは、私のメインアプリとは別のインテントです。AndroidのFacebook SDK:バックボタンの問題

ネットワークが接続されていない、または信号が不足している場合は、バックボタン(ハードウェア)を押してFacebookの意図を取り消すことができます。私はバックボタンのためにトラップして私のメインアプリに戻ってきますが、facebook SDKはまだ接続を開こうとしているスレッドを回転させる必要があります。

私がキャンセルして約1分後に、メインアプリケーションがFacebookの接続スレッドのタイムアウトとして爆発し、AuthListenerで制御を返します。

AndroidRuntime E android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your acti 
            vity running? 
26860   AndroidRuntime E  at android.view.ViewRoot.setView(ViewRoot.java:447) 
26860   AndroidRuntime E  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:283) 
26860   AndroidRuntime E  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:193) 
26860   AndroidRuntime E  at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:118) 
26860   AndroidRuntime E  at android.view.Window$LocalWindowManager.addView(Window.java:532) 
26860   AndroidRuntime E  at android.app.Dialog.show(Dialog.java:269) 
26860   AndroidRuntime E  at com.facebook.android.FbDialog$FbWebViewClient.onPageStarted(FbDialog.java:180) 
26860   AndroidRuntime E  at android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:265) 
26860   AndroidRuntime E  at android.os.Handler.dispatchMessage(Handler.java:99) 
26860   AndroidRuntime E  at android.os.Looper.loop(Looper.java:132) 
26860   AndroidRuntime E  at android.app.ActivityThread.main(ActivityThread.java:4123) 
26860   AndroidRuntime E  at java.lang.reflect.Method.invokeNative(Native Method) 
26860   AndroidRuntime E  at java.lang.reflect.Method.invoke(Method.java:491) 
26860   AndroidRuntime E  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
26860   AndroidRuntime E  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
26860   AndroidRuntime E  at dalvik.system.NativeStart.main(Native Method) 

Facebookの接続プロセスを正常にキャンセルするにはどうすればよいですか?

答えて

2

他の人に役立つ場合は、finish()の前にauthListenersとLoginListenersを削除して、接続スレッドが終了した後に制御を与えられないようにしなければなりませんでした。 FacebookのFbDialog.javaライブラリのソースで

if (mAuthListener != null) 
{ 
    Log.d (TAG, "removing listerners"); 
    SessionEvents.removeAuthListener (mAuthListener); 
    SessionEvents.removeLogoutListener (mLogoutListener); 
} 

、私はまた、いくつかの変更を行うために必要な。スレッド(ネットワーク・コネクターだと思います)はまだ実行され、完了したらログイン・ページを表示してみてください。しかしそれをする見解はなく、物事はカフルイになった。私はonReceivedError()メソッドからcancelルーチンを取り出しましたが、inventingとerrorCodeまたはdescriptionの代わりに、mListener.onError ...をmListener.cancel()に変更しました。 OK、これまで...

// FbDialog.java 
// -------------------------------------------------------------------------- 
    private boolean mCanceled = false; 

を動作するようです...

public boolean onKeyDown (int keyCode, KeyEvent event) 
    { 
     // cancel everything if hardware Back button is hit 
     if (keyCode == KeyEvent.KEYCODE_BACK) 
     { 
     mCanceled = true; 

     if (mSpinner != null) 
      if (mSpinner.isShowing()) 
      mSpinner.cancel(); 

     mListener.onCancel(); 
     FbDialog.this.dismiss(); 
     return (true); 
     } 

     return (false); 
    } 

...

protected void onCreate (Bundle savedInstanceState) 
    { 
     mCanceled = false; 
     ... 
    } 

    public void onPageStarted (WebView view, String url, Bitmap favicon) 
    { 
     ...   
     // only show the progress dialog if we've not been canceled 
     // this was part of the problem with leaked memory after canceling 
     if (mCanceled == false) 
     mSpinner.show(); 
    } 

...

public void onPageFinished (WebView view, String url) 
    { 
     // only dismiss if dialog is showing 
     if (mSpinner.isShowing()) 
     mSpinner.dismiss(); 
    }