我创建了一个单例类来连接到 Facebook 并获取用户的凭据。这是:
public class FacebookHelper implements Session.StatusCallback {
private static final String TAG = FacebookHelper.class.getSimpleName();
private static final int REQUEST_CODE_FACEBOOK = 64206;
public static final String FACEBOOK_STRING = "Facebook";
private static FacebookHelper instance = null;
private static Activity activity;
private FacebookHelper(Context context) {
CupsLog.d(TAG, "FacebookHelper");
this.activity = (Activity) context;
}
public static FacebookHelper getInstance(Context context) {
if (instance == null) {
instance = new FacebookHelper(context);
}
return instance;
}
public void commitFacebookLogin() {
CupsLog.d(TAG, "commitFacebookLogin");
FileAccessUtil.getInstance(activity).setStringProperty(Consts.AUTH_TYPE, FacebookHelper.FACEBOOK_STRING);
if (Session.getActiveSession() != null && Session.getActiveSession().isOpened()) {
onSessionStateChanged(Session.getActiveSession(), Session.getActiveSession().getState(), null);
} else {
Session.openActiveSession(activity, true, this);
}
}
@Override
public void call(Session session, SessionState state, Exception exception) {
onSessionStateChanged(session, state, exception);
}
private void onSessionStateChanged(Session session, SessionState state, Exception exception) {
CupsLog.d(TAG, "onSessionStateChanged, state: " + state.toString());
if (state.isOpened()) {
setFacebookTokenAndCookie();
App.getEventBus().post("Facebook");
}
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
CupsLog.d(TAG, "onActivityResult");
switch (requestCode) {
case REQUEST_CODE_FACEBOOK: {
Session.getActiveSession().onActivityResult(activity, requestCode, resultCode, data);
break;
}
default: {
break;
}
}
}
private void setFacebookTokenAndCookie() {
CupsLog.i(TAG, "setFacebookTokenAndCookie");
String val = "fb+" + Session.getActiveSession().getAccessToken();
CupsLog.i(TAG, "Facebook access_token: " + val);
CookieUtil.getInstance(activity).setCookie(CookieUtil.AUTH_COOKIE_NAME, val, true);
CupsTracker.instance.sendAnalyticsEvent(CupsTracker.LOGIN, CupsTracker.FACEBOOK_LOGIN, CupsTracker.FACEBOOK_LOGIN, null);
CupsTracker.instance.sendAnalyticsView("fb login");
CupsTracker.instance.trackMobileAppTrackerAction(CupsTracker.FACEBOOK_LOGIN);
App.getInstance().setAuthSource(App.AuthSource.FACEBOOK);
AccountService.getInstance(activity).pullAccountDetailsFromServer();
}
public void closeAndClearTokenInformation()
{
CupsLog.d(TAG, "closeAndClearTokenInformation");
Session session = Session.getActiveSession();
if (session != null && !session.isClosed()) {
session.closeAndClearTokenInformation();
}
}
}
所以,基本上当我想连接到 Facebook 时,我会从我的 Activity
运行此方法。
FacebookHelper.getInstance(LoginActivity.this).commitFacebookLogin();
第一次运行效果很好,但问题是第二次我收到标题中指定的错误。现在我知道我的这个辅助类是单例的,但是我能做些什么来改变它呢?我有什么选择?
我认为我的查询不重复 for this question因为我遇到这个错误的情况与那里的情况完全不同。
最佳答案
要解决此问题,我必须更改单例 getter:
public static FacebookHelper getInstance(Context context) {
if (instance == null) {
instance = new FacebookHelper(context);
}
return instance;
}
对此:
public static FacebookHelper getInstance(Context context) {
if (instance == null) {
instance = new FacebookHelper(context);
}
else
{
activity = (Activity) context;
}
return instance;
}
并使用 Activity 实例而不是简单的上下文。基本上,每次获取单例实例时,我都会为其分配一个新 Activity 。
关于android - 无法使用空调用包调用 LoginActivity。如果调用者的 launchMode 为 singleInstance,则可能会发生这种情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23640933/