方法被多次调用,但只调用一次

时间:2013-05-23 15:50:28

标签: android facebook facebook-android-sdk

我在Android应用程序中实现了Facebook SDK。我正在使用SDK的登录功能。我想做的是以下几点:

  • 当MainActivity启动时,检查是否存在活动会话
  • 如果没有,请让用户有机会登录facebook
  • 如果有,用户必须被重定向到另一个Activity(让我们称之为:HomeActivity)。

当我的应用程序启动时,它会启动MainActivity。我的onCreate()方法如下所示:

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  this.app = (ApplicationClass)getApplicationContext();

  app.setUiHelper(new UiLifecycleHelper(this, callback));

  uiHelper = app.getUiHelper();
  uiHelper.onCreate(savedInstanceState);
  if(this.app.getLoggedIn()) {

      setContentView(R.layout.login);
  startLoggingIn(); // <-- Makes login button invisible and starts spinner
      login();


  } else {

      setContentView(R.layout.login);

  }
}

ApplicationClass是一个类,我在其中设置可在整个应用程序生命周期中使用的所有类型的信息。这并不重要,但我认为我将其包含在示例中。

因此,当MainActivity启动时,它应该调用login()方法,如下所示:

public void login() {

            logging_in = true;
            Log.i(TAG, "Loggin in");
            synchronized (this) {

                  // start Facebook Login
                  Session.openActiveSession(this, true, new Session.StatusCallback() {

                    // callback when session changes state
                    @Override
                    public void call(Session session, SessionState state, Exception exception) {


                        if (Session.getActiveSession().isOpened()) {

                            // make request to the /me API
                            Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {

                              // callback after Graph API response with user object
                              @Override
                              public void onCompleted(GraphUser user, Response response) {

                                  if (user != null) { // User is logged in

                                      app.setUser(user);
                                      app.setLoggedIn(true);

                                      // Redirect user to the HomeActivity
                                      Intent intent = new Intent(getBaseContext(), HomeActivity.class);
                                      startActivity(intent);

                                  } 
                              }
                            });

                        }
                    }
                  });

                  logging_in = false;

            }


    }

最后,我对Facebook会话的回调看起来像这样:

private void onSessionStateChange(Session session, SessionState state, Exception exception) {
        if (state.isOpened()) {

            synchronized (this) {
                  if( ! logging_in ) {
                      login();  
                  }

            }


        } else if (state.isClosed()) {

            setContentView(R.layout.login);

        }
    }

它做得很好,除了多次调用login()方法。我日志中的输出是:

enter image description here

为什么这么多次被调用?它显然确保HomeActivity意图多次启动。我无法弄清楚原因。

解决方案

稍微改变了我的Session.StateCallback。它现在看起来像这样:

private void onSessionStateChange(Session session, SessionState state, Exception exception) {
        if (state.isOpened()) {

            if(state == SessionState.OPENED_TOKEN_UPDATED) {

                Log.i(TAG, "OPENED_TOKEN_UPDATED");
                login();

            } else if (state == SessionState.OPENED) {

                if(app.getUser() != null) {

                    // Redirect user to the HomeActivity
                    Intent intent = new Intent(getBaseContext(), HomeActivity.class);
                    startActivity(intent);

                } else {

                    login();

                }

            }


        } else if (state.isClosed()) {

            if(state == SessionState.CLOSED_LOGIN_FAILED) {
                Log.i(TAG, "CLOSED_LOGIN_FAILED");

                setContentView(R.layout.login);

            } else if(state == SessionState.CLOSED) {

                Log.i(TAG, "CLOSED");
                //setContentView(R.layout.login);
            }



        }
    }

2 个答案:

答案 0 :(得分:2)

最有可能的原因是你从onSessionState调用登录名更改了。

当您登录会话时会发生什么事情时,它会改变正确的方式。 当它改变时,调用onSessionState更改并调用login。

我希望无限循环,但似乎Facebook已为此做了一些处理。

答案 1 :(得分:1)

我也遇到了同样的问题..我刚刚更改了我的活动结果代码。它工作..