Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Facebook SDK:后退按钮的麻烦_Android_Facebook_Sdk - Fatal编程技术网

Android Facebook SDK:后退按钮的麻烦

Android Facebook SDK:后退按钮的麻烦,android,facebook,sdk,Android,Facebook,Sdk,我正在使用Facebook Android SDK从我的Android应用程序登录并发布到用户的墙上。Facebook发帖程序与我的主应用程序是分开的 当没有网络连接或信号不好时,我希望能够点击后退按钮(硬件)并取消facebook的意图。我可以点击“后退”按钮返回主应用程序,但facebook SDK必须启动一个线程,该线程仍在尝试打开连接 在我取消后大约一分钟,当facebook connect线程超时并返回AuthListener中的控制时,主应用程序爆炸 AndroidRuntime

我正在使用Facebook Android SDK从我的Android应用程序登录并发布到用户的墙上。Facebook发帖程序与我的主应用程序是分开的

当没有网络连接或信号不好时,我希望能够点击后退按钮(硬件)并取消facebook的意图。我可以点击“后退”按钮返回主应用程序,但facebook SDK必须启动一个线程,该线程仍在尝试打开连接

在我取消后大约一分钟,当facebook connect线程超时并返回AuthListener中的控制时,主应用程序爆炸

AndroidRuntime  E  android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@40bb3de0 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连接过程

如果对其他人有帮助,我必须在finish()之前删除authListeners和LoginListeners,这样在连接线程终止后它们就不会被赋予控制权

if (mAuthListener != null)
{
    Log.d (TAG, "removing listerners");
    SessionEvents.removeAuthListener (mAuthListener);
    SessionEvents.removeLogoutListener (mLogoutListener);
}
在FacebookFBDialog.java库源代码中,我还需要做一些更改。一个线程(我想是网络连接器)仍然会运行,完成后,尝试显示登录页面。然而,并没有人打算这么做,事情就这样发生了。我从onReceivedError()方法中获取了cancel例程,但我没有发明错误代码或描述,而是更改了mListener.onError。。。到mListener.cancel()。到目前为止似乎还行

// 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 ();
    }