アプリに戻ったときにSharedPreferencesが更新されないという奇妙な問題があります。シナリオは次のとおりです。
同じ共有設定を使用する2つのプロジェクトがあります。Project1とProject2。それらは別個ですが、関連するアプリです。それらは同じキーで署名され、sharedUserIdを使用して情報を共有します。
Project1はProject2を開きます。
Project2は、SharedPreferencesファイルを取得し、次のメソッドを介して書き込みます。
Context prefsContext = c.createPackageContext(packageNameOfProject1, Context.CONTEXT_IGNORE_SECURITY);
SharedPreferences prefs = prefsContext.getSharedPreferences(fileName, Context.MODE_PRIVATE);
SharedPreferences.editor editor = prefs.edit();
editor.putBool("bool1", value1);
editor.putBool("bool2", value2);
...
editor.putBool("boolN", valueN);
editor.apply();
それが終わったら、を呼び出してProject1に戻りfinish()
ます。
次に、Project1は次のようにデータを読み取ります。
SharedPreferences prefs = getSharedPreferences(getPreferencesFileName(), Context.MODE_PRIVATE);
Boolean value1 = prefs.getBoolean(fileName, false);
Boolean value2 = prefs.getBoolean(fileName, false);
...
Boolean valueN = prefs.getBoolean(fileName, false);
Map<String, ?> mappings = prefs.getAll();
Set<String> keys = mappings.keySet();
for(String key : keys) {
log.d(TAG, "_____");
log.d(TAG, "Key = " + key);
log.d(TAG, "Value = " + mappings.get(key));
}
問題は、Project1で値が更新されないことです。最後のログに基づいて、ファイルがマッピングを生成していないことがわかります。ただし、xmlが更新されていることを確認できます。アプリを強制的に停止してから再起動すると、すべてのマッピングがProject1にあります。すべての値が正しいです。ただし、ユーザーがProject2を離れるときに更新する必要があります。ここに欠けているものがあるように感じますが、それを見つけることができません。
このテーマで私が見つけたのは次のとおりです。
SharedPreferences.Editorが最初のコミット後に更新されない
私はすでにそれをしているので、これらは役に立ちません。
両方のマニフェストにWRITE_EXTERNAL_STORAGEを設定しています。fileNameは同じです(そうでない場合、アプリを再入力したときにファイルを読み取ることができません)。
編集:
競合状態に直面していると思っていeditor.commit()
たのではなく、やろうとしたことに注意する必要があります。editor.apply()
問題はまだ解決していません。何らかの理由で、Project1のSharedPreferenceへの古い参照が、毎回遅延読み込みしているにもかかわらず、新しい参照の代わりに使用されていると思います。
EDIT2:
OK、さらにテストして、どのIDが実行されているかを確認します。私は反対の方向を試すことにしました。
Project1では、次のことを行います。
Float testFloat (float) Math.random();
Log.d("TEST_FLOAT", "Project1: TEST_FLOAT = " + testFloat);
prefs.edit().putFloat("TEST_FLOAT", testFloat).commit();
Project2では次のことを行います。
Log.d("TEST_FLOAT", "Project2: TEST_FLOAT = " + prefs.getFloat("TEST_FLOAT", 0.0f));
次に、次のように2つの間を行ったり来たりしProject1->Project2->Project1->Project2->Project1->Project2
ます。logcatの結果は次のとおりです。
Project1: TEST_FLOAT = 0.30341884
Project2: TEST_FLOAT = 0.30341884
Project1: TEST_FLOAT = 0.89398974
Project2: TEST_FLOAT = 0.30341884
Project1: TEST_FLOAT = 0.81929415
Project2: TEST_FLOAT = 0.30341884
つまり、同じファイルの読み取りと書き込みを行っています。ただし、プロジェクトで最初に開いたときのマッピングは保持されます。プロジェクトを閉じても、アプリケーションが強制的に停止されるまでマッピングは残ります。