带Singleton的OnSaveInstanceState

nha*_*man 7 java singleton android

我有一个Singleton Data类,我用它来存储数据.我正在以不同Fragment的方式访问它.

Fragment加载第一个时,Singleton中的所有字段都没有问题null.当显示第二个时Fragment,它依赖于这些字段来显示其数据.第一个Fragment确保初始化这些字段.

但是,当用户按下第二个中的主页按钮Fragment,并在大约一个小时后再次打开它时,Singleton已丢失其所有数据,并Fragment尝试访问null字段.

我想实现这个onSaveInstanceState方法,但是我很难理解它是如何工作的 - 我没有数据的实例来分配它.

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putSerializable("DATA", Data.getInstance());
}

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);

    savedInstanceState.getSerializable("DATA"); //What to do with this?
}
Run Code Online (Sandbox Code Playgroud)

欢迎任何帮助.

Mar*_*one 2

这些片段是否都托管在同一个活动中?如果是这样,为什么不将共享状态存储在 Activity 的成员中,并使用 Activity 的 onSaveInstanceState() 和 onCreate() 来保存和恢复它。在你的片段中,你可以做...

((MyActivityClass)getActivity()).getSharedState()
Run Code Online (Sandbox Code Playgroud)

否则,你可以让你的单例对象管理一个可以序列化和反序列化的成员对象:

MySingleton.instance().saveTo(outState);
MySingleton.instance().restoreFrom(savedInstanceState);
MySingleton.instance().getState();
Run Code Online (Sandbox Code Playgroud)

在哪里

public void restoreFrom(Bundle savedInstanceState) {
    mState = savedInstanceState.getSerializable("DATA");
}
Run Code Online (Sandbox Code Playgroud)