我正在从片段中将一些数据保存到SharedPreference,并希望在其他片段中使用这些数据。但是我想只在成功保存SharedPreferences时执行片段事务,否则,其他片段将无法检索数据(因为使用这些SharedPreference值来检索数据)。
我的代码:
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener{
... ... ... ... ... ... ... ... ...
public void setSharedPref(String key, String val) {
SharedPreferences sharedPref = this.getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString(key, val);
editor.commit();
}
public String fetchSharedPref(String key) {
SharedPreferences sharedPref = this.getPreferences(Context.MODE_PRIVATE);
String val = sharedPref.getString(key, Constant.SHARED_PREF_DEFAULT_MSN);
return val;
}
}
如何确保成功保存SharedPreferences? 是否有任何方法可以实现仅在SharedPreferences成功保存时才会调用的回调?
答案 0 :(得分:3)
来自 docs 。
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(getString(R.string.saved_high_score), newHighScore);
editor.commit();
然后去检查commit()
方法here。
返回类型:布尔值
描述:如果新值已成功写入持久存储,则返回true。
答案 1 :(得分:2)
找到解决方案:
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt("Your Key", "Your value");
boolean savedOrNot = editor.commit();
if(savedOrNot){
// Successfully saved
}else{
// Not saved
}
答案 2 :(得分:1)
应用()强>
这会立即将数据保存到内存中并保存数据 磁盘在一个单独的线程上。所以没有机会阻挡主力 线程(你的应用程序不会挂起)。
这是首选技术,但此后才可用 Gingerbread(API 9,Android 2.3)。
<强>提交()强>
调用此方法会将数据保存到文件中,但过程是 在调用它的线程中执行,停止其他所有操作 直到保存完成。 成功完成后返回true, 失败时错误。
如果您需要确认保存成功,请使用
commit()
数据或者您是否正在为姜饼设备开发。commit()
自API 1以来一直可用
因此您可以在editor.commit();
commit()
会返回true
,否则会返回false
。
答案 3 :(得分:1)
commit()返回true,否则返回false。 您可以按如下方式更改方法。
public boolean setSharedPref(String key, String val) {
SharedPreferences sharedPref = this.getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString(key, val);
return editor.commit()
}
apply和commit https://developer.android.com/reference/android/content/SharedPreferences.Editor.html
之间的区别答案 4 :(得分:1)
editor.commit()将返回布尔值,它会告诉您数据是否已保存。
如果您想分析共享首选项和sqlite中保存的所有数据,那么我建议使用facebook stetho
它是android的调试桥,您可以检查所有共享首选项数据和SQL数据库以进行调试。