Facebook从setRetainInstance片段登录

时间:2013-06-19 19:05:38

标签: android facebook

希望这篇文章可以作为遇到类似问题的人的帮助,但这是我最近遇到的问题:

背景

我们推出自己的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();
 }

该片段不会被保留。我知道这是相对复杂的,但它的要点是片段将被销毁,因为它还没有机会被完全激活。

1 个答案:

答案 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;
    }
}

希望这可以帮助有类似问题的人。