Android 从setRetainInstance片段登录Facebook
希望这篇文章能为遇到类似问题的人提供帮助,但以下是我最近遇到的问题: 背景 我们推出了自己的facebook登录片段,使其与3.0 sdk中的示例相对类似。该片段是一个setRetainInstance(true)片段,预计来自facebook SDK的回调将被传递到相关片段。登录过程将在片段的onCreate()方法中启动,如下所示:Android 从setRetainInstance片段登录Facebook,android,facebook,Android,Facebook,希望这篇文章能为遇到类似问题的人提供帮助,但以下是我最近遇到的问题: 背景 我们推出了自己的facebook登录片段,使其与3.0 sdk中的示例相对类似。该片段是一个setRetainInstance(true)片段,预计来自facebook SDK的回调将被传递到相关片段。登录过程将在片段的onCreate()方法中启动,如下所示: if (sessionIsOpenable(session)) { session.openForRead(new Session.OpenRe
if (sessionIsOpenable(session)) {
session.openForRead(new Session.OpenRequest(this).setCallback(mReadStatusCallback).setPermissions(mReadPermissions));
} else if (SessionState.OPENING != session.getState()) {
Session.openActiveSession(getActivity(), this, true, mReadStatusCallback);
}
遇到问题
这似乎只发生在用户首次登录/授权尝试时,FB或本地缓存中不存在缓存访问令牌。当用户接受读取权限请求时,facebook SDK会调用我们的回调,但我们的片段不会执行任何额外的处理,因为我们在如下检查中保护了额外的工作:
if (isResumed()) {
// Do processing (adding fragments, etc...)
}
我们看到了从暂停到恢复的片段转换,但它出现在片段的新实例上,而不是启动登录尝试的实例上。当我在调试过程中删除isResumed()的检查时,代码将由于未附加片段而崩溃
原因
我们发现,您绝对无法从片段的onCreate()方法执行会话初始化,因为facebook将启动自己的活动,这将导致片段被FragmentManager设置为非活动状态(这会导致在活动恢复时向片段管理器添加新的片段实例)。这是因为片段管理器在初始化片段时执行此操作:
if (!f.mRetaining) {
f.performCreate(f.mSavedFragmentState);
}
f.mRetaining = false;
片段将进行的下一次转换将调用:
if (!f.mRetaining) {
f.performDestroy();
}
而且碎片不会被保留。我知道这相对比较复杂,但要点是碎片会被销毁,因为它还没有完全激活的机会。解决方法 我们已经能够运行runnable onResume(),因此我们在onCreate()中将初始化代码添加到runnable中,并在onResume()中执行该runnable 希望这能帮助有类似问题的人
mResumeRunnable = new Runnable() {
@Override
public void run() {
if (sessionIsOpenable(session)) {
session.openForRead(new Session.OpenRequest(AbstractFacebookLoginFragment.this)
.setCallback(mReadStatusCallback).setPermissions(mReadPermissions));
} else if (SessionState.OPENING != session.getState()) {
Session.openActiveSession(getActivity(), AbstractFacebookLoginFragment.this,
true, mReadStatusCallback);
}
};
@Override
public void onResume() {
super.onResume();
if (null != mResumeRunnable) {
mResumeRunnable.run();
mResumeRunnable = null;
}
}