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 オブジェクトにコミットできます。

したがって、この問題を解決するには、edit を 1 回だけ呼び出す必要があります。コードは次のように変更できます。

  @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() を呼び出すと、同じオブジェクトではなく、新しい参照が取得されます。

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