15

SharedPreferencesを使用して、アプリのユーザー設定を保存しようとしています。Activity.onCreateメソッドに次のコードがあります。

sharedPreferences = context.getSharedPreferences("MMPreferences", 0);
soundOn = sharedPreferences.getBoolean("soundOn", true);

しかし、それは私にこのエラーを与えます(エラーを生成するのはgetBooleanです):

11-10 16:32:24.652: D/StrictMode(706): StrictMode policy violation; ~duration=229 ms: android.os.StrictMode$StrictModeDiskReadViolation: policy=2079 violation=2

その結果、値が読み取られず、このコードを使用してSharedPreferencesに書き込もうとすると、同じエラーが発生します(エラーを生成するのはコミットです)。

SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean("soundOn", soundOn);
editor.commit();

私が見つけることができるこのエラーに対する唯一の答えは、厳密モードの警告に関するものですが、私のコードは実際にはSharedPreferencesキー/値データの読み取り/書き込みに失敗します。

4

2 に答える 2

20

別のスレッドで fileSystem 操作を行う必要があります。そうすれば、エラーはなくなります。

StrictMode をオフにすることもできます (ただし、お勧めしません)。

StrictMode.ThreadPolicy old = StrictMode.getThreadPolicy();
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder(old)
    .permitDiskWrites()
    .build());
doCorrectStuffThatWritesToDisk();
StrictMode.setThreadPolicy(old);
于 2012-11-10T15:43:23.500 に答える
5

Android プロジェクトでリアクティブ (RxJava) が構成されている場合は、I/O 固有のスケジューラでタスクをスケジュールするなど、そのプロパティを利用できます。たとえば、次のようになります。

public void saveFavorites(List<String> favorites) {
    Schedulers.io().createWorker().schedule(() -> {
        SharedPreferences.Editor editor = mSharedPreferences.edit();
        Gson gson = new Gson();
        String jsonFavorites = gson.toJson(favorites);
        editor.putString(Constants.FAVORITE, jsonFavorites);
        editor.apply();
    });
}
于 2016-05-19T02:50:54.100 に答える