SharedPreferences を機能させようとして問題が発生しています。
これはコードです:
/**
* Sets the software in synchronizing status.
* @param synchronizing Boolean
*/
public void setSynchronizing(boolean synchronizing) {
if(D) Log.d(TAG, "Called: setSynchronizing("+synchronizing+")");
SharedPreferences preferences = mContext.getSharedPreferences(SharedPrefsConstants.PREFERENCES, 0);
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean(SharedPrefsConstants.SYNCHRONIZING, synchronizing);
boolean result = editor.commit();
if(!result)
Log.w(TAG, "Cannot store the preference.");
if(!synchronizing)
BroadcastUtils.stopSynchronizing(mContext);
}
/**
* Returns whether the software is synchronizing.
* @return True if synchronization is happening.
*/
public boolean isSynchronizing() {
SharedPreferences preferences = mContext.getSharedPreferences(SharedPrefsConstants.PREFERENCES, 0);
boolean synchronizing = preferences.getBoolean(SharedPrefsConstants.SYNCHRONIZING, false);
if(D) Log.d(TAG, "Called: isSynchronizing Returning: "+synchronizing);
return synchronizing;
}
これは logcat の出力です。アプリケーションで 2 つの別個のプロセスを使用していることに注意してください。それらをappとapp:bgと呼びます。
**app** D/StorageManager﹕ Called: setSynchronizing(true)
**app** D/StorageManager﹕ Called: setSynchronizing(true)
**app** D/StorageManager﹕ Called: isSynchronizing Returning: true
**app** D/StorageManager﹕ Called: isSynchronizing Returning: true
**app:bg** D/StorageManager﹕ Called: setSynchronizing(false)
**app** D/StorageManager﹕ Called: isSynchronizing Returning: true
StorageManagerはシングルトン インスタンスですが、プロセスごとに 1 つずつ、合計 2 つのインスタンスがあります。
setSynchronizing(false) がバックグラウンド スレッドから呼び出されている場合でも、物理設定ファイルは正しく変更されますが、フォアグラウンド スレッドでは依然として true です。
setSynchronizing がその変数を false に設定した後、isSynchronizing メソッドが true を返していることがわかります。質問:なぜこれが起こるのですか? このソフトウェアで SharedPreferences を使用するのはこれが初めてなので、他の場所に設定することはできません。
これは、isSynchronizing がまだ TRUE を返している場合に、電話機内に保存される設定ファイルです。
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<boolean name="synchronizing" value="false" />
</map>
私が考えることができる唯一のことは、SharedPreferences がメモリ内に何らかのキャッシュを保持しているということです。これを確認できれば、SharedPreference の更新を強制する方法がありますか?
また、変数が false に設定されてから、その後フォアグラウンド スレッドから isSynchronizing が呼び出されるまでに、かなりの時間が経過していることも言わなければなりません。