2013-06-09 6 views
10

मेरे पास निम्न गतिविधि है और मैं फेसबुक के लॉगिन बटन का उपयोग कर रहा हूं। ऑनस्टेशनस्टेट चेंज को कई बार बुलाया जा रहा है। मेरे पास एक एसिंक्टास्क है जो मैं सफल लॉगिन के बाद दौड़ना चाहता हूं जो एक बार पूर्ण होने पर एक नई गतिविधि भी खुलता है। अभी यह एकाधिक एसिंक कार्यों को शुरू करता है। मैं अंतिम स्थिति कैसे ढूंढ सकता हूं ताकि यह दो बार आग नहीं लगेगा? मैंने सभी उदाहरणों को देखा और फेसबुक ने कहा कि session.isOpened() को काम करना चाहिए, लेकिन यह अभी भी कई बार फायरिंग कर रहा है।फेसबुक एसडीके 3.0 कॉलबैक आग दो बार

अद्यतन:

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

मुझे लगता है कि इसे दो बार कहा जाता है क्योंकि उद्घाटन राज्य से खुली स्थिति में संक्रमण। हर बार जब आप सत्रस्टेट चेंज पर कॉल करते हैं तो कुछ लॉग के साथ सत्र की स्थिति की जांच करने का प्रयास करें। – 5agado

+0

@ 5agado बस थक गया और दोनों बार राज्य खुला है। – nawlrus

+0

जैसा कि आपने अद्यतन वाक्यांश में कहा था, समस्या यह है कि पहली बार ऑनक्रेट सत्र की तुलना में सत्र खोलता है (पहली कॉल का कारण बनता है) दूसरी कॉल का कारण बनता है क्योंकि एक खोला सत्र मिलता है। आप फेसबुक सलाह का पालन नहीं कर सकते हैं या आपको विभिन्न मामलों को अलग करने के लिए कुछ और जांच करनी है। – 5agado

उत्तर

23

मुझे एक ही समस्या थी।

एक कॉल UiLifecycleHelper से आ रही है जब यह कॉलबैक का आह्वान:

UiLifecycleHelper callback 
onSessionStateChange() 

अन्य गतिविधि LoginFragment शुरू करने से आता है।

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

कई मामलों में, यह ठीक है, लेकिन आपके मामले में यह AsyncTask के कारण स्पष्ट रूप से एक समस्या है।

आप सत्रस्टेट चेंज() पर प्राप्त सत्र को कैश कर सकते हैं और देख सकते हैं कि इसका राज्य और टोकनइन्फो बदल गया है, और उसके बाद ही आपके एसिंक कार्य को आमंत्रित करें। सत्र स्थिति और टोकनइन्फो के संयोजन की जांच करना पर्याप्त होना चाहिए:

private void onSessionStateChange(Session session, SessionState state, Exception exception) { 
    if (state.isOpened()) { 
     if (mSession == null || isSessionChanged(session)) { 
      mSession = session; 
      LogUtils.LOGFB(TAG, "Logged in using facebook"); 
      LogUtils.LOGFB(TAG, "Access Token: " + session.getAccessToken()); 
      // Run your AsyncTask 
     } 

    } else if (state.isClosed()) { 
     LogUtils.LOGFB(TAG, "Logged out from facebook"); 
     // Display your non-authenticated UI 
    } 
} 

private boolean isSessionChanged(Session session) { 

    // Check if session state changed 
    if (mSession.getState() != session.getState()) 
     return true; 

    // Check if accessToken changed 
    if (mSession.getAccessToken() != null) { 
     if (!mSession.getAccessToken().equals(session.getAccessToken())) 
      return true; 
    } 
    else if (session.getAccessToken() != null) { 
     return true; 
    } 

    // Nothing changed 
    return false; 
} 
संबंधित मुद्दे