在共享首选项中存储和检索数组列表值android返回null
我试图在共享首选项中存储和检索值,但第一次打开应用时,共享首选项值为空。从下一次开始,它将显示上一个键的值 这是我的密码在共享首选项中存储和检索数组列表值android返回null,android,firebase,arraylist,set,sharedpreferences,Android,Firebase,Arraylist,Set,Sharedpreferences,我试图在共享首选项中存储和检索值,但第一次打开应用时,共享首选项值为空。从下一次开始,它将显示上一个键的值 这是我的密码 SharedPreferences sharedPreferences; SharedPreferences.Editor editor; Set<String> set; sharedPreferences = getApplicationContext().getSharedPreferences(mypreference, Context.MODE_PRIV
SharedPreferences sharedPreferences;
SharedPreferences.Editor editor;
Set<String> set;
sharedPreferences = getApplicationContext().getSharedPreferences(mypreference, Context.MODE_PRIVATE);
databaseReferenceImages.child(postkey).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
SharedPreferences.Editor editor = sharedPreferences.edit();
Set<String> sharedlist = new HashSet<String>();
sharedlist.addAll(second);
editor.putStringSet("notifications", sharedlist);
editor.apply();
for (String a : sharedlist) {
Log.d("thesharedlist", a);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
set = sharedPreferences.getStringSet("notifications", null);
if (set != null) {
for (String a : set) {
Log.d("thesetis", a);
}
}
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
set = sharedPreferences.getStringSet("notifications", null);
if (set != null) {
for (String a : set) {
Log.d("thesetis", a);
}
}
}
}, 1500);
SharedReferences SharedReferences;
SharedReferences.Editor;
集合;
SharedReferences=getApplicationContext().GetSharedReferences(mypreference,Context.MODE\u PRIVATE);
databaseReferenceImages.child(postkey).addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
SharedReferences.Editor=SharedReferences.edit();
Set sharedlist=new HashSet();
sharedlist.addAll(第二个);
编辑器.putStringSet(“通知”,共享列表);
editor.apply();
for(字符串a:sharedlist){
Log.d(“共享列表”,a);
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
set=SharedReferences.getStringSet(“通知”,null);
如果(设置!=null){
for(字符串a:集合){
日志d(“thesetis”,a);
}
}
这里我想要一个特定“POSTKEY”的值(每个post的Poskey都不同)
我想在onDataChange方法之外获取数组列表或“SET”的值,所以我使用了共享首选项。对于字符串,它可以正常工作,但对于数组列表或集合则不行。出现以下问题:
- 当我第一次打开应用程序并单击某个特定帖子时, 返回的共享首选项值的值为NULL
- 当我第二次打开同一篇文章时,值是 完美回归
- 当我打开第二个帖子时 以前的帖子正在返回
- 当我再次打开第一篇文章时,第二篇文章的值正在返回
我不知道我错在哪里。我尝试在每次打开应用程序时清除共享首选项的值,但同样的问题也发生了。我甚至遵循这一点,但没有任何效果。任何帮助都会很好。提前感谢。如果您不想第一次得到空值,可以执行以下两种操作之一: 1-以不同方式调用
getStringSet
sharedPreferences.getStringSet("notifications", "it isn't saved yet!");
2-将默认值保存到SharedReference
之前的getStringSet
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putStringSet("notifications", sharedlist);
editor.apply();
如果你想得到当前文章而不是上一篇文章,你应该在之前保存它。我猜你点击第一篇文章,它存储在
SharedReference
中,当你想检查第二篇文章时,它会返回第一篇文章。我已经解决了这个问题,在1500毫秒后将它存储在SharedReference中
这是我的密码
SharedPreferences sharedPreferences;
SharedPreferences.Editor editor;
Set<String> set;
sharedPreferences = getApplicationContext().getSharedPreferences(mypreference, Context.MODE_PRIVATE);
databaseReferenceImages.child(postkey).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
SharedPreferences.Editor editor = sharedPreferences.edit();
Set<String> sharedlist = new HashSet<String>();
sharedlist.addAll(second);
editor.putStringSet("notifications", sharedlist);
editor.apply();
for (String a : sharedlist) {
Log.d("thesharedlist", a);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
set = sharedPreferences.getStringSet("notifications", null);
if (set != null) {
for (String a : set) {
Log.d("thesetis", a);
}
}
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
set = sharedPreferences.getStringSet("notifications", null);
if (set != null) {
for (String a : set) {
Log.d("thesetis", a);
}
}
}
}, 1500);
尝试
editor.commit
它在@lunarWatcher不起作用您检查过数据是否确实保存到编辑器中了吗?如果实际调用了相关的代码,则无法将数组保存到SharedReference
中,当第一次没有任何内容时,它应该返回null,您还期望得到什么?这意味着当应用程序第一次运行时,SharedReference
中没有存储任何内容。我已经做了第二件事。亲爱的@Anusha,我确实读过你的代码。你没有做第二个解决方案addValueEventListener
是异步的,它可能在getStringSet
之后运行。谢谢!!那么我应该在哪里写getStringSet的代码呢?在addValueEventListener
的内部,或者把你的putStringSet
放在addValueEventListener
的外部,然后调用getStringSet
。我想从addValueEventListener中获取值,所以我把它放在集合中,检索,并使用getStringSet仅在addValueEventListener之外