Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从setRetainInstance片段登录Facebook_Android_Facebook - Fatal编程技术网

Android 从setRetainInstance片段登录Facebook

Android 从setRetainInstance片段登录Facebook,android,facebook,Android,Facebook,希望这篇文章能为遇到类似问题的人提供帮助,但以下是我最近遇到的问题: 背景 我们推出了自己的facebook登录片段,使其与3.0 sdk中的示例相对类似。该片段是一个setRetainInstance(true)片段,预计来自facebook SDK的回调将被传递到相关片段。登录过程将在片段的onCreate()方法中启动,如下所示: if (sessionIsOpenable(session)) { session.openForRead(new Session.OpenRe

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

背景

我们推出了自己的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设置为非活动状态(这会导致在活动恢复时向片段管理器添加新的片段实例)。这是因为片段管理器在初始化片段时执行此操作:

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