我有FragmentActivity:
public class FragmentActivity extends FragmentActivity
{
// ...
protected void onCreate(Bundle savedInstanceState) {
if (savedInstanceState != null) {
myFragment = (MyFragment) getSupportFragmentManager().getFragment(
savedInstanceState, MyFragment.class.getName());
}
else {
myFragment = new Fragment(myObject);
}
}
}
在我的片段中:
public class MyFragment extends Fragment
{
public MyFragment(myObject) {
super();
this.myObject = myObject;
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
MyDAO myDAO = new MyDAO (myObject);
}
}
一切正常,除非我关闭我的应用程序,做一些事情(我的应用程序在后台进入),然后重新启动我的应用程序。 我在
上得到一个NullPointerExceptionMyDAO myDAO = new MyDAO (myObject);
其中myObject为null。
调用savedInstanceState ...我不明白这是如何工作的。
TY
答案 0 :(得分:2)
系统正在查杀您的进程,并且myObject的实例正在被垃圾收集。 设置要保留的实例仅在方向更改之间有用,但请记住,当系统内存不足时,在后台运行的应用程序可能会被终止。将此变量作为参数传递。在MyDAO类上实现Parcelable或Serializable非常重要。
PS。:你需要为你的片段建一个空的构造函数,因为系统在重新创建活动时会重新创建它的实例:
public MyFragment() {
}
public MyFragment(myObject) {
super();
setRetainInstance(true);
Bundle args = new Bundle();
args.putParcelable("myObject", myObject);
setArguments(args);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
myObject = getArguments().getParcelable("myObject");
MyDAO myDAO = new MyDAO (myObject);
}