2013-06-09 9 views
10

私は以下のアクティビティを持っており、FacebookのLoginButtonを使用しています。 onSessionStateChangeが複数回呼び出されています。私はログインが成功した後に実行したいasynctaskを持っています。これは、一度完了すると新しいアクティビティを開きます。今、これは複数の非同期タスクを開始します。どのようにして2回発射しないように最終状態を見つけることができますか? Iveはすべての例を見て、Facebookはsession.isOpened()はうまくいくはずだと言っていますが、それでもまだ何度も起動しています。Facebook SDK 3.0コールバックが2回発生する

UPDATE:

onResumeからセッションコードを除去した後、それが一度だけ呼び出されますが、https://developers.facebook.com/docs/howtos/androidsdk/3.0/login-with-facebook/#step3によると、私は特定の状況のた​​めOnResumeでそのコードが必要です。

public class LoginActivity extends SherlockActivity { 

private static final String TAG = "LoginActivity"; 

private Context context; 
private int statusCode; 
private String emailAddress = null; 
private String password = null; 
private GraphUser fbUser; 

private UiLifecycleHelper uiHelper; 

private Session.StatusCallback callback = new Session.StatusCallback() { 
    @Override 
    public void call(Session session, SessionState state, 
      Exception exception) { 
     onSessionStateChange(session, state, exception); 
    } 
}; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_login); 

    context = getApplicationContext(); 

    uiHelper = new UiLifecycleHelper(this, callback); 
    uiHelper.onCreate(savedInstanceState); 

    final LoginButton fbBtn = (LoginButton) findViewById(R.id.facebook_login); 
    fbBtn.setReadPermissions(Arrays.asList("basic_info", "email")); 
    /* 
    * fbBtn.setOnClickListener(new View.OnClickListener() { 
    * 
    * @Override public void onClick(View v) { 
    * 
    * Intent intent = new Intent(context, MainActivity.class); 
    * startActivity(intent); 
    * 
    * finish(); 
    * 
    * } }); 
    */ 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    uiHelper.onPause(); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    uiHelper.onDestroy(); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 

    // For scenarios where the main activity is launched and user 
    // session is not null, the session state change notification 
    // may not be triggered. Trigger it if it's open/closed. 
    Session session = Session.getActiveSession(); 
    if (session != null && (session.isOpened() || session.isClosed())) { 
     onSessionStateChange(session, session.getState(), null); 
    } 
    uiHelper.onResume(); 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    uiHelper.onSaveInstanceState(outState); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    Log.d("FbLogin", "Result Code is - " + resultCode +""); 
    uiHelper.onActivityResult(requestCode, resultCode, data); 

} 

private void onSessionStateChange(Session session, SessionState state, 
     Exception exception) { 
    if (session != null && session.isOpened()) { 
     Log.i(TAG, "Logged in..."); 
     Log.i(TAG, "Access Token" + session.getAccessToken()); 

     if (state == SessionState.OPENED) { 
     Request.executeMeRequestAsync(session, 
       new Request.GraphUserCallback() { 
        @Override 
        public void onCompleted(GraphUser user, 
          Response response) { 
         if (user != null) { 
          Log.i(TAG, "User ID " + user.getId()); 
          Log.i(TAG, "Email " + user.asMap().get("email")); 

          fbUser = user; 

          //FbRegisterTask fbReg = new FbRegisterTask(LoginActivity.this, user); 
          //fbReg.execute(); 
          //finish(); 
         } 
        } 
       }); 
     } 

    } else if (session.isClosed()) { 
     Log.i(TAG, "Logged out..."); 
    } 
} 
} 
+0

オープン状態からオープン状態への移行が2回あると思います。 onSessionStateChangeを呼び出すたびに、セッションの状態をログで確認してみてください。 – 5agado

+0

@ 5agadoちょうど疲れて、両方の状態が開いています。 – nawlrus

+0

UPDATE句で述べたように、問題は最初にonCreateがonResumeよりも(最初の呼び出しを引き起こす)セッションを開き、開かれたセッションを見つけるために2番目の呼び出しを引き起こすことです。 Facebookのアドバイスに従うことはできません。また、異なるケースを区別するためにもう少しチェックをしなければなりません。 – 5agado

答えて

23

私は同じ問題がありました。それはコールバックを呼び出したときに

つのコールがUiLifecycleHelperから来ている:

UiLifecycleHelper callback 
onSessionStateChange() 

他のLoginFragmentを再開Activityから来ています。

LoginActivity.onResumeFragments() 
LoginFragment.onResume() 
onSessionStateChange() 

多くの場合、これは問題ありませんが、あなたのケースでは明らかにAsyncTaskに起因する問題です。

受信したセッションをonSessionStateChange()でキャッシュし、その状態とtokenInfoが変更されているかどうかを確認してから、非同期タスクのみを呼び出すことができます。セッション状態とtokenInfoの組み合わせを確認すれば十分です:

関連する問題