Android中的共享首选项出现问题 - 我希望能够将一些字符串(保存图片的ID)作为下次发布的最爱 - 它工作得很完美,它会识别出ID是否已经在共享首选项并在必要时删除它,但是当我通过按下主页按钮停止应用程序(不杀死应用程序进程)然后返回到它时,它不再识别它。如果我终止进程并重新启动应用程序,它可以正常工作。
所以这是我的代码
MainActivity onCreate
preferences = getSharedPreferences("favo", MODE_PRIVATE);
edit = getSharedPreferences("favo", MODE_PRIVATE).edit();
MainActivity onResume
@Override
protected void onResume() {
preferences = getSharedPreferences("favo", MODE_PRIVATE);
edit = getSharedPreferences("favo", MODE_PRIVATE).edit();
super.onResume();
}
我已经尝试在没有onResume的情况下这样做,但它没有改变结果。
更改共享首选项的方法
if (checkTheSharedPreferences(numberFavo)){
v.setBackgroundResource(R.drawable.favo);
edit.putString(pref, pref);
edit.apply();
showIt = "Zu Favoriten hinzugefügt";
}else{
v.setBackgroundResource(R.drawable.favo2);
edit.remove(pref);
edit.apply();
showIt = "Aus Favoriten entfernt";
}
如果我的方法检查SharedPreferences是否返回true,则意味着String不在SharedPrefs内并且可以添加,否则它将被删除,因为用户想要从他的收藏夹中删除它。
检查字符串是否在Prefs
内的方法public Boolean checkTheSharedPreferences(int number) {
SharedPreferences preferences = getSharedPreferences("favo", MODE_PRIVATE);
Map<String, ?> map = preferences.getAll();
for (Map.Entry<String, ?> entry : map.entrySet()) {
if (entry.getValue().toString().equals(bilderIDs.get(number))) {
return false;
}
}
return true;
}
如上所述,它完美无缺,除非应用程序不可见/进入后台并再次打开而不重新启动。
提前致谢
修改
如果我在onResume被调用后等待大约30秒后似乎有效,但是如果它在UI线程上并且用户可能按下按钮来删除/添加,则不太可能等待30秒内的SharedPref
答案 0 :(得分:4)
SharedPreferences.Editor.apply()是一个异步方法。它将值存储在其他thread.SharedPreferences.Editor.commit()中是一种同步方法。
if (checkTheSharedPreferences(numberFavo)){
v.setBackgroundResource(R.drawable.favo);
edit.putBoolean("myfav" + numberFavo, true);
edit.commit();
showIt = "Zu Favoriten hinzugefügt";
}else{
v.setBackgroundResource(R.drawable.favo2);
edit.remove("myfav" + numberFavo);
edit.commit();
showIt = "Aus Favoriten entfernt";
}
public Boolean checkTheSharedPreferences(int number) {
SharedPreferences preferences = getSharedPreferences("favo", MODE_PRIVATE);
return preferences.getBoolean("myfav" + number,false);
}
@Override
protected void onResume() {
super.onResume();
preferences = getSharedPreferences("favo", MODE_PRIVATE);
edit = getSharedPreferences("favo", MODE_PRIVATE).edit();
}
答案 1 :(得分:2)
/******* Create SharedPreferences *******/
SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", MODE_PRIVATE);
Editor editor = pref.edit();
/**************** Storing data as KEY/VALUE pair *******************/
editor.putBoolean("key_name1", true); // Saving boolean - true/false
editor.putInt("key_name2", "int value"); // Saving integer
editor.putFloat("key_name3", "float value"); // Saving float
editor.putLong("key_name4", "long value"); // Saving long
editor.putString("key_name5", "string value"); // Saving string
// Save the changes in SharedPreferences
editor.commit(); // commit changes
/**************** Get SharedPreferences data *******************/
// If value for key not exist then return second param value - In this case null
pref.getBoolean("key_name1", null); // getting boolean
pref.getInt("key_name2", null); // getting Integer
pref.getFloat("key_name3", null); // getting Float
pref.getLong("key_name4", null); // getting Long
pref.getString("key_name5", null); // getting String
/************ Deleting Key value from SharedPreferences *****************/
editor.remove("key_name3"); // will delete key key_name3
editor.remove("key_name4"); // will delete key key_name4
// Save the changes in SharedPreferences
editor.commit(); // commit changes
/************ Clear all data from SharedPreferences *****************/
editor.clear();
editor.commit(); // commit changes