2012-03-16 5 views
2

Facebook Android SDK를 사용하여 Android 앱에서 로그인하고 사용자의 벽에 게시합니다. Facebook 게시 루틴은 내 메인 앱과는 별도의 인 텐트입니다.Android Facebook SDK : 뒤로 버튼 번잡함

네트워크 연결이 없거나 신호가 불량하면 뒤로 버튼 (하드웨어)을 누르고 페이스 북의 의도를 취소 할 수 있기를 원합니다. 뒤로 버튼을 잡아 내 메인 앱으로 돌아갈 수는 있지만 페이스 북 SDK는 여전히 연결을 열려고하는 스레드를 회전시켜야합니다.

내가 취소 한 지 약 1 초 후에 메인 애플리케이션이 페이스 북 연결 스레드가 시간 종료됨에 따라 폭발하고 내 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) 

어떻게 페이스 북 연결 프로세스를 정상적으로 취소 할 수 있습니까?

답변

2

다른 사람들에게 도움이되는 경우, finish() 전에 authListeners와 LoginListeners를 특별히 제거해야 연결 스레드가 종료 된 후에 제어 권한이 부여되지 않습니다.

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

페이스 북의 FbDialog.java 라이브러리 소스에서 일부 변경해야했습니다. 스레드 (네트워크 커넥터라고 생각합니다)가 계속 실행되고 완료된 후에 로그인 페이지를 표시하고 시도하십시오. 그러나 그것을 할 어떤 전망도 없었다. 그리고 물건은 kaflooey 갔다. 취소 루틴을 onReceivedError() 메소드에서 가져 왔지만 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(); 
    }