मेरे पास निम्न गतिविधि है और मैं फेसबुक के लॉगिन बटन का उपयोग कर रहा हूं। ऑनस्टेशनस्टेट चेंज को कई बार बुलाया जा रहा है। मेरे पास एक एसिंक्टास्क है जो मैं सफल लॉगिन के बाद दौड़ना चाहता हूं जो एक बार पूर्ण होने पर एक नई गतिविधि भी खुलता है। अभी यह एकाधिक एसिंक कार्यों को शुरू करता है। मैं अंतिम स्थिति कैसे ढूंढ सकता हूं ताकि यह दो बार आग नहीं लगेगा? मैंने सभी उदाहरणों को देखा और फेसबुक ने कहा कि 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...");
}
}
}
मुझे लगता है कि इसे दो बार कहा जाता है क्योंकि उद्घाटन राज्य से खुली स्थिति में संक्रमण। हर बार जब आप सत्रस्टेट चेंज पर कॉल करते हैं तो कुछ लॉग के साथ सत्र की स्थिति की जांच करने का प्रयास करें। – 5agado
@ 5agado बस थक गया और दोनों बार राज्य खुला है। – nawlrus
जैसा कि आपने अद्यतन वाक्यांश में कहा था, समस्या यह है कि पहली बार ऑनक्रेट सत्र की तुलना में सत्र खोलता है (पहली कॉल का कारण बनता है) दूसरी कॉल का कारण बनता है क्योंकि एक खोला सत्र मिलता है। आप फेसबुक सलाह का पालन नहीं कर सकते हैं या आपको विभिन्न मामलों को अलग करने के लिए कुछ और जांच करनी है। – 5agado