2011-05-05 40 views
7

我试图从Facebook SDK显示墙上发布对话框时收到错误的令牌异常(每两次发生一次我运行应用程序)。尝试显示Facebook对话框时出现'BadTokenException:无法添加窗口' - Android

我有一个'发布'按钮,它的工作是显示对话框,如果用户登录到他的FB帐户,或显示登录对话框(然后立即显示'贴在墙上'对话框)如果该用户未登录到他的帐户。

这里是上发布按钮的点击监听器 -

mPostButton.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      if(mLoginButton.getVisibility() == 0) 
       postOnWall(); 
      else 
       mLoginButton.performClick(); 
     } 
    }); 

这里的onAuthSucceed()监听器 -

public void onAuthSucceed() { 
    postOnWall(); 
} 

这里的PostOnWall功能(其中显示了发布对话框) -

public void postOnWall() 
{ 
    Bundle params = new Bundle(); 
    params.putString("name", FBname); 
    params.putString("link", FBlink); 
    params.putString("description", FBdescription); 
    params.putString("picture", FBpicture); 
    con = this; 
    mFacebook.dialog(con, "feed", params, new SampleDialogListener()); 
} 

以下是错误的日志 -

05-05 16:25:09.601: WARN/WindowManager(109): Attempted to add application window with unknown token HistoryRecord{405416b0 android.alco/.do_drive}. Aborting. 
05-05 16:25:27.292: ERROR/AndroidRuntime(20089): android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running? 
05-05 16:25:27.292: ERROR/AndroidRuntime(20089):  at android.view.ViewRoot.setView(ViewRoot.java:527) 
05-05 16:25:27.292: ERROR/AndroidRuntime(20089):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 
05-05 16:25:27.292: ERROR/AndroidRuntime(20089):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
05-05 16:25:27.292: ERROR/AndroidRuntime(20089):  at android.view.Window$LocalWindowManager.addView(Window.java:424) 
05-05 16:25:27.292: ERROR/AndroidRuntime(20089):  at android.app.Dialog.show(Dialog.java:241) 
05-05 16:25:27.292: ERROR/AndroidRuntime(20089):  at com.facebook.android.Facebook.dialog(Facebook.java:622) 
05-05 16:25:27.292: ERROR/AndroidRuntime(20089):  at android.alco.do_drive.postOnWall(do_drive.java:258) 
05-05 16:25:27.292: ERROR/AndroidRuntime(20089):  at android.alco.do_drive$SampleAuthListener.onAuthSucceed(do_drive.java:172) 
05-05 16:25:27.292: ERROR/AndroidRuntime(20089):  at android.alco.SessionEvents.onLoginSuccess(SessionEvents.java:78) 
05-05 16:25:27.292: ERROR/AndroidRuntime(20089):  at android.alco.LoginButton$LoginDialogListener.onComplete(LoginButton.java:100) 
05-05 16:25:27.292: ERROR/AndroidRuntime(20089):  at com.facebook.android.Facebook$1.onComplete(Facebook.java:308) 
05-05 16:25:27.292: ERROR/AndroidRuntime(20089):  at com.facebook.android.FbDialog$FbWebViewClient.shouldOverrideUrlLoading(FbDialog.java:133) 

我看了所有,我找不到解决方案。

编辑 - 这只发生在用户没有登录的情况下。在这种情况下,他按下'发布'按钮,登录,然后调用'postOnWall'函数,这会产生错误。我现在正在为此工作2天,并且找不到任何相关信息。

谢谢!

+1

'BadTokenException'几乎总是用'Context'传递给它做。你的'this'指针是什么? – 2011-05-05 14:07:25

+0

这是活动的上下文,而不是应用程序的。如果我使用应用程序上下文,则会显示不同的错误。情况并非如此。 – Tofira 2011-05-05 14:09:46

回答

0

看起来您已经提供了一些方法,其中上下文/活动对象不再处于活动状态。 可能在postOnWall方法中。 该方法中的this是当前显示的活动吗?

+0

是的,这是活动的上下文,而不是应用程序的。我不妨在那里写下[活动名称]。这个。我知道这可能是一个问题,但我不使用应用程序上下文,所以这里不是这种情况。 – Tofira 2011-05-05 14:08:18

0

面对同样的问题。据我所知,从谷歌搜索,它与你的活动有时没有准备好,当Facebook登录活动返回其结果。为什么?没有线索。

但是我认为这样会更好:在你的类中定义一个标志,在AuthListener中设置标志,并在onStart中显示警告if if标志。然后,你将肯定会在自己的活动的舒适性:

private boolean authSuccess = false; 

...

public class SampleAuthListener implements AuthListener { 
    authSuccess = true; 

...

protected void onStart() { 
    super.onStart(); 
    if (authSuccess) { 
     alert.show(); 
    } 
} 

免责声明:我很少的Java/Android的经验。

8
@Override 
public void onPageStarted(WebView view, String url, Bitmap favicon) { 
    Log.d("Facebook-WebView", "Webview loading URL: " + url); 
    super.onPageStarted(view, url, favicon); 
    if(FbDialog.this.isShowing()) 
     mSpinner.show(); 
} 
1

当然并且存在如

View view = getLocalActivityManager().startActivity(id, intent).getDecorView(); 
setContentView(view); 

被运行代码的ActivityGroup衍生类内的情况下 - 在一个选项卡式活性的单个标签下许多活动之间的切换的情况下。可以肯定的是,“这”在

AlertDialog.Builder builder = new AlertDialog.Builder(WhateverActivity.this); 

被通过适当的参考WhateverActivity的父更换喜欢

AlertDialog.Builder builder = new AlertDialog.Builder(ActivityGroupDerivedParentOfWhateverActivity.this); 
+0

谢谢...它救了我:) – Noman 2012-11-06 12:11:44

相关问题