【问题标题】:Fragment savedInstanceState not null after activity killed by OS活动被操作系统杀死后,片段 savedInstanceState 不为空
【发布时间】:2017-02-06 14:10:33
【问题描述】:

我有一个通过setRetainInstance(true) 保存状态的片段。这是我的片段非常简化的代码:

public class MyFragment extends Fragment {
  private SomeData mData;

  public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
  }

  @Override
  public void onActivityCreated(@Nullable Bundle savedInstanceState) {
      if (savedInstanceState == null) {
        mData = new SomeData(getView());
      } else {
        mData.refresh(getView());
      }
      // More awesome code
    }
  }
}

有时应用程序会因NullPointerException 而崩溃——我的mData 突然变成null。当我折叠应用程序并在一段时间后返回时会发生这种情况。

我有一些理论。一段时间后,操作系统杀死了ActivityFragment(尽管setRetainInstance (true))。因此创建了我的片段的一个新对象,其中mDatanull 初始化。但savedInstanseState 不等于 null。因此,新片段跳过初始化并尝试在空引用上调用refresh(View)

我的问题: 当操作系统终止活动(当应用不在屏幕上时)并在返回后重新创建时,我的 sn-p 中 onActivityCreated(savedInstanceState) 方法中的 savedInstanseState 变量将包含什么?

【问题讨论】:

    标签: android android-fragments android-lifecycle


    【解决方案1】:

    不完全确定答案,但这是我能猜到的

    setRetainInstance(boolean retain) 控制一个片段实例是否 在 Activity 重新创建期间保留(例如从配置 改变)。 这只能用于不在后台堆栈中的片段。

    所以我认为,当您折叠活动时,视图会被破坏,并且实例数据(setReetainInstance 值)会保存在包中(在加载时使 savedInstanceState != null)。但是,当您加载活动时(因为之前将 retainInstance 设置为 true)onCreate() 不会被调用,并且因为 savedInstanceState != null 和 mData == null 您会收到错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多