使用单例模式的OnSaveInstanceState

7
我有一个单例数据类用来存储数据,我在不同的“Fragment”中访问它。当第一个“Fragment”加载时,单例中所有字段为“null”没有问题。当显示第二个“Fragment”时,它依赖这些字段来显示其数据。第一个“Fragment”确保初始化这些字段。然而,当用户在第二个“Fragment”中按Home键,并在一个小时左右再次打开它时,该单例已经丢失了所有数据,“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?
}

欢迎提供任何帮助。


但我不确定为什么 singleton 会失去所有数据?应用程序仍在后台运行,不是吗?我在我的应用程序中使用相同的范例,没有看到数据丢失。 - Aviral
我遇到了这个问题,所以我猜它确实存在。 - nhaarman
有意思!如果您对导致单例中的数据消失有任何想法,请发帖。这让我感到担忧。谢谢。 - Aviral
2个回答

2

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

((MyActivityClass)getActivity()).getSharedState()

否则,您可以使单例对象管理一个可序列化和反序列化的成员对象:
MySingleton.instance().saveTo(outState);
MySingleton.instance().restoreFrom(savedInstanceState);
MySingleton.instance().getState();

Where

public void restoreFrom(Bundle savedInstanceState) {
    mState = savedInstanceState.getSerializable("DATA");
}

0
你可以看一下this。如果你需要传递大对象,onSaveInstanceState方法并不是很可取。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接