我希望保存我的应用状态,暂停时,在SharedPreferences中,并在调用onResume时加载它:
在我的onPause方法中:
@Override
protected void onPause()
{
super.onPause();
SharedPreferences prefs = getSharedPreferences("MyPrefName", 0);
if(socket!=null && socket.isConnected())
{
releaseOutputSocket();
prefs.edit().putString("started", "started");
}
else
prefs.edit().putString("started", "stoped");
boolean res = prefs.edit().commit(); //res == true
}
在onResume方法中我做:
@Override
public void onResume()
{
super.onResume();
SharedPreferences prefs = getSharedPreferences("MyPrefName", 0);
Log.v("Main", prefs.getString("started", "default")); // in log I see "default"
}
你能告诉我,我的代码有什么问题吗?
答案 0 :(得分:1)
每次创建一个新的SharedPreferences.Editor并提交一个空白的。你没有承诺其他的。相反:
SharedPreferences.Editor edit = prefs.edit();
edit.putString("newString", "started");
edit.commit();
答案 1 :(得分:0)
您所犯的错误是每次拨打Editor
时都会获得一个新的SharedPreferences.edit()
对象。根据文件的说法:
为这些首选项创建一个新的编辑器,通过该编辑器可以对首选项中的数据进行修改,并将这些更改原子地提交回SharedPreferences对象。
所以要解决这个问题,你只需要调用一次编辑。您的代码可以更改为:
@Override
protected void onPause()
{
super.onPause();
SharedPreferences prefs = getSharedPreferences("MyPrefName", 0);
Editor edit = prefs.edit();
if(socket!=null && socket.isConnected())
{
releaseOutputSocket();
edit.putString("started", "started");
}
else
edit.putString("started", "stoped");
edit.commit(); //res == true
}
答案 2 :(得分:0)
您需要在用于放置String的引用上调用commit。当你调用prefs.edit()时,你获得一个新的引用,而不是同一个对象。
SharedPreferences.Editor prefs = getSharedPreferences("MyPrefName", 0).edit();
[..]
prefs.putString(..);
[..]
prefs.commit();