Android Facebook SDK:后退按钮
问题描述:
我正在使用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连接过程?
答
为了帮助其他人,我必须在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();
}