[英]Fragment savedInstanceState not null after activity killed by OS
我有一个片段,它通过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
。 当我折叠应用程序并在一段时间后返回时,会发生这种情况。
我有一些理论。 一段时间后,操作系统杀死了Activity
和Fragment
(尽管setRetainInstance (true)
)。 因此创建了我的片段的新对象,其中mData
由null
初始化。 但是savedInstanseState
不等于null。 因此,新片段将跳过初始化,并尝试在null引用上调用refresh(View)
。
我的问题:当操作系统onActivityCreated(savedInstanceState)
活动(当应用程序不在屏幕上时)并在返回后重新创建时,我的代码片段中的onActivityCreated(savedInstanceState)
方法中的savedInstanseState
变量将包含什么?
不能完全确定答案,但这是我能猜到的
setRetainInstance(布尔值保留)控制是否在Activity重新创建期间保留片段实例(例如,从配置更改中保留)。 这只能与不在后堆栈中的片段一起使用。
所以我认为,当您折叠活动时,视图将被破坏,实例数据(setReetainInstance值)被保存在捆绑包中(在加载时使saveInstanceState!= null)。 但是,当您加载活动时(因为之前将keepInstance设置为true),onCreate()不会被调用,并且由于saveInstanceState!= null和mData == null会导致错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.