2012-03-16 153 views
2

我正在使用Facebook Android SDK從我的android應用程序登錄併發布到用戶的牆上。 Facebook的發佈例程是我主應用程序中的一個單獨的Intent。Android Facebook SDK:後退按鈕

當沒有網絡連接或信號不好時,我希望能夠點擊後退按鈕(硬件)並取消facebook意圖。我可以捕獲後退按鈕並回到我的主應用程序,但Facebook SDK必須啓動一個仍在嘗試打開連接的線程。

大約一分鐘後,我取消,主要的應用程序爆炸爲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,以便在連接線程終止後它們不會被賦予控制權。

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

在Facebook FbDialog.java庫源文件中,我還需要進行一些更改。一個線程(我認爲是網絡連接器)仍然可以運行,並且在完成之後,嘗試並顯示登錄頁面。然而,沒有意見可以做,而且事情變得糟糕透頂。我從onReceivedError()方法取消了取消例程,而不是發明和errorCode或說明,我只是將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(); 
    }