Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在共享首选项中存储和检索数组列表值android返回null_Android_Firebase_Arraylist_Set_Sharedpreferences - Fatal编程技术网

在共享首选项中存储和检索数组列表值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之外