希望这篇文章可以作为遇到类似问题的人的帮助,但这是我最近遇到的问题:
背景
我们推出自己的facebook登录片段,并使其与3.0 sdk的样本相对类似。该片段是一个setRetainInstance(true)片段,预计来自facebook SDK的回调将被传递给相关片段。登录过程将在片段的onCreate()方法中启动,如下所示:
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使片段无效(导致我们的活动恢复时要添加到片段管理器的新片段实例)。这是因为FragmentManager在初始化片段时执行此操作:
if (!f.mRetaining) {
f.performCreate(f.mSavedFragmentState);
}
f.mRetaining = false;
片段将进行的下一次转换将调用此:
if (!f.mRetaining) {
f.performDestroy();
}
该片段不会被保留。我知道这是相对复杂的,但它的要点是片段将被销毁,因为它还没有机会被完全激活。
答案 0 :(得分:0)
解决方法强>
我们已经能够运行runnable onResume(),因此我们将初始化代码添加到onCreate()中的runnable中,并且runnable在onResume()中执行。
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;
}
}
希望这可以帮助有类似问题的人。