在共享首选项中存储和检索数组列表值android返回null

时间:2017-05-14 10:24:12

标签: android firebase arraylist set sharedpreferences

我正在尝试在共享首选项中存储和检索值,但是第一次打开应用程序时,共享首选项值为NULL。从下次开始,它会显示上一个键的值。

这是我的代码,

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);
        }
    }

这里我想要一个特定的“POSTKEY”的值(每个帖子的Poskey都不同) 我想获取onDataChange方法之外的数组列表或“SET”的值,所以我使用了共享首选项。它适用于String但不适用于Array列表或Set。出现以下问题,

  • 当我第一次打开应用并点击特定帖子时, 返回的共享首选项值的值为NULL。

  • 当我第二次打开同一个帖子时,值是 完美地回归。

  • 当我打开第二篇文章时,值为 上一篇文章正在回归

  • 当我再次打开第一篇文章时,第二篇文章的值正在返回。

我不知道我哪里错了。每次应用程序打开时我都尝试清除共享首选项的值,但会出现同样的问题。我甚至遵循了这个link但没有任何效果。任何帮助都会很棒。提前谢谢。

2 个答案:

答案 0 :(得分:1)

如果你不想第一次获得null,你可以做以下两件事之一:

1-以不同方式致电getStringSet

sharedPreferences.getStringSet("notifications", "it isn't saved yet!");

2-在sharedpreference

之前将默认值保存到getStringSet
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putStringSet("notifications", sharedlist);
editor.apply();

如果你想获得当前的帖子而不是之前的帖子,你应该先保存它。我的猜测是你单击第一个帖子并将其存储在sharedpreference中,当你想要检查第二个时,它会返回第一个。

答案 1 :(得分:0)

我已经在1500ms之后将其存储在sharedpreference中解决了这个问题。

这是我的代码,

   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);