Android 如何使我的SharedReferences对象在应用程序关闭后保存数据?

Android 如何使我的SharedReferences对象在应用程序关闭后保存数据?,android,sharedpreferences,storing-data,Android,Sharedpreferences,Storing Data,我制作了一个应用程序,她的主要目的是保存某种信息(现在哪些信息不重要),在我的应用程序中,我制作了一个名为sp的SharedPreferences对象和一个名为Editor的SharedPreferences.Editor对象 在我的onCreate()方法中,我检索存储的哈希集,如下所示: Set<String> setFull = sp.getStringSet("SET_FULL", new HashSet<String>()); 在每个活动中,我都需要这

我制作了一个应用程序,她的主要目的是保存某种信息(现在哪些信息不重要),在我的应用程序中,我制作了一个名为sp的
SharedPreferences
对象和一个名为Editor的
SharedPreferences.Editor
对象

在我的
onCreate()
方法中,我检索存储的哈希集,如下所示:

    Set<String> setFull = sp.getStringSet("SET_FULL", new HashSet<String>());
在每个活动中,我都需要这个集合,所以我会像上面的例子一样检索它

在主活动上(我在HashSet上执行所有操作的活动), 当活动打开并处于活动状态时,我可以将其添加到HashSet和我的
SharedReferences
项目中,编辑它和所有内容,当我在活动之间旅行时,我可以看到我添加的所有内容,一切都很好,但一旦我关闭应用程序(从emulator/phone/android studio)并重新打开它,所有的数据都被删除了,我需要重新添加所有内容

我尝试用4种不同的方式将该集存储回我的编辑器:

1:在我的
onCreate()
方法中:

   editor.putStringSet("SET_FULL", setFull);
   editor.apply();            //also tried .commit()
2:重写我的主要活动中的方法
onDestroy()

@Override
protected void onDestroy() {
    super.onDestroy();
    editor.putStringSet("SET_FULL", setFull);
    editor.apply();
}
@Override
protected void onPause() {
    super.onPause();
    editor.putStringSet("SET_FULL", setFull);
    editor.apply();
}
@Override
protected void onStop() {
    super.onStop();
    editor.putStringSet("SET_FULL", setFull);
    editor.apply();
}
3:在我的主要活动中重写方法
onPause()

@Override
protected void onDestroy() {
    super.onDestroy();
    editor.putStringSet("SET_FULL", setFull);
    editor.apply();
}
@Override
protected void onPause() {
    super.onPause();
    editor.putStringSet("SET_FULL", setFull);
    editor.apply();
}
@Override
protected void onStop() {
    super.onStop();
    editor.putStringSet("SET_FULL", setFull);
    editor.apply();
}
4:在我的主要活动中重写方法
onStop()

@Override
protected void onDestroy() {
    super.onDestroy();
    editor.putStringSet("SET_FULL", setFull);
    editor.apply();
}
@Override
protected void onPause() {
    super.onPause();
    editor.putStringSet("SET_FULL", setFull);
    editor.apply();
}
@Override
protected void onStop() {
    super.onStop();
    editor.putStringSet("SET_FULL", setFull);
    editor.apply();
}
在我的主要活动中,我也试着一个接一个地将所有4个选项(也只尝试了2个或3个等等)放在一起,但这似乎也不起作用

我还尝试在.commit()到.apply()之间进行交换(当我在
SharedReferences.Editor
对象上使用
.putStringSet(“,set)
时,在该对象上进行交换),但这两个对象都出现了相同的问题

我没有任何错误,也没有任何警告或问题(没有崩溃,什么都没有),只要应用程序关闭,无论以何种方式关闭,它似乎都会删除所有内容。
在过去的一周里,我一直在寻找解决方案,也问朋友们(他们建议使用与互联网相同的方法,这是压倒一切的方法),但似乎没有一个有效,然而,无论我在哪里阅读或询问,每个人都告诉我,即使在我的应用程序关闭后,SharedReferences对象仍应保留我存储在其中的数据。

如文档中所述:

请注意,您不能修改此调用返回的set实例。如果您这样做,则无法保证存储数据的一致性,也根本无法修改实例


因此,请确保不要更改从
getStringSet()
方法返回的
Set
。如果你这样做,就会发生奇怪的事情。

多亏了@Henry answer,我解决了我的问题,根据我做的一些额外研究,我将写下解决我问题的两件事。 这两种解决方案是: 第一个是基于@Henry answer的:我没有对从SharedReferences对象获得的哈希集进行操作,而是像这样复制它(对象本身而不是引用):

Set<String> newSet = new HashSet(setFull);
这就解决了我的整个问题,它在应用程序关闭后将数据保存在SharedReferences中


感谢所有帮助过我的人

如何获取首选项-您的sp对象?是的,我正在从我的sp引用(我的SharedReferences对象)检索我的哈希集,并使用我的SharedReferences.Editor编辑器,稍后将其放回。否,我是指用于获取sp对象的代码。你能添加它吗?我添加了一些,但这里是全部内容:SharedReferences sp=PreferenceManager.GetDefaultSharedReferences(这个);SharedReferences.Editor=sp.edit();Set setFull=sp.getStringSet(“Set_FULL”,new HashSet());然后我在setFull集合上进行操作,当我完成时,我把它放回去,就像我在我的问题中所展示的那样,比如:editor.putStringSet(“Set_FULL”,toReturn);editor.apply()//也尝试了。提交();看起来不错。我的猜测是,当你关闭模拟器时,你会从中删除应用程序。尝试从仿真器关闭应用程序,然后在不使用AndroidStudio的情况下从仿真器再次打开它。还是这样吗?好吧,你会建议我怎么做?因为我需要动态地(用户)向其中添加越来越多的项并将它们保存到HashSet?您需要将返回的集复制到另一个。可以更改新的集合,然后将其存储回去。您的意思是:set setFull=sp.getStringSet(“set_FULL”,new HashSet());然后:Set newSet=setFull;然后操纵新闻集上的所有内容,最后将新闻集存储到我的SharedReferences中?不。这不会复制数据
newSet
只是对同一对象的新引用。你的意思是这样吗?Set newSet=newhashset(setFull);我不熟悉集合和哈希集合,我不确定这样是否可以?