作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
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,这意味着该字符串不在 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
最佳答案
SharedPreferences.Editor.apply() 是一个异步方法。它会将值存储在其他线程中。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();
}
关于android - SharedPreferences 不适用于 Resume,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34693576/
我是一名优秀的程序员,十分优秀!