StrictModeDiskReadViolation, когда

Я пытаюсь использовать 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.

Ответ 1

Вы должны делать операции с файловой системой в отдельном потоке, затем ошибка исчезнет.

вы также можете отключить StrictMode (но я не рекомендую это)

StrictMode.ThreadPolicy old = StrictMode.getThreadPolicy();
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder(old)
    .permitDiskWrites()
    .build());
doCorrectStuffThatWritesToDisk();
StrictMode.setThreadPolicy(old);

Ответ 2

Если у вас есть реактивный (RxJava), настроенный в вашем проекте Android, вы можете воспользоваться его свойствами, такими как планирование задачи в планировщике ввода-вывода, например:

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();
    });
}