Android Fragment和重新加载应用程序

时间:2013-04-25 12:57:09

标签: android instance fragment reload

我有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);
    }
}

一切正常,除非我关闭我的应用程序,做一些事情(我的应用程序在后台进入),然后重新启动我的应用程序。 我在

上得到一个NullPointerException
MyDAO myDAO = new MyDAO (myObject);

其中myObject为null。

调用savedInstanceState ...我不明白这是如何工作的。

TY

1 个答案:

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