SharedPreferences无法加载

时间:2013-03-28 13:08:48

标签: java android

我希望保存我的应用状态,暂停时,在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"   
}

你能告诉我,我的代码有什么问题吗?

3 个答案:

答案 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();