3

我有我的 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 为空。

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

4

1 回答 1

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);
}
于 2013-04-25T13:04:40.307 回答