0

我想在 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"   
}

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

4

3 回答 3

1

您每次都在创建一个新的 SharedPreferences.Editor 并提交一个空白。你没有承诺其他人。取而代之的是:

SharedPreferences.Editor edit = prefs.edit();
edit.putString("newString", "started");
edit.commit();
于 2013-03-28T13:11:13.287 回答
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
}
于 2013-03-28T13:13:21.107 回答
0

您需要在用于放置字符串的引用上调用 commit。当您调用 prefs.edit() 时,您会获得一个 NEW 引用,而不是同一个对象。

SharedPreferences.Editor prefs = getSharedPreferences("MyPrefName", 0).edit();
[..]
prefs.putString(..);
[..]
prefs.commit();
于 2013-03-28T13:13:30.550 回答