Neigaard
Neigaard

Reputation: 4050

StrictModeDiskReadViolation when

I am trying to use SharedPreferences to store some user settings for my app. I have this code in my Activity.onCreate method:

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

but it gives me this error (it is the getBoolean that generates the error):

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

and the result is that the value is not read and I also get the same error when I try to write to the SharedPreferences with this code (it is the commit that generates the error):

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

The only answers for this error I can find is about a strict mode warning, but my code actually fails to read/write the SharedPreferences key/value data.

Upvotes: 15

Views: 32262

Answers (2)

yaircarreno
yaircarreno

Reputation: 4247

If you have reactive (RxJava) configured in your Android project, you can take advantage of its properties like schedule a task on an I/O-specific Scheduler, for instance:

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

Upvotes: 5

Frank
Frank

Reputation: 15631

You must do fileSystem operations on a separate thread, then the error will go away.

you can also turn off the StrictMode (but i am not recommending that)

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

Upvotes: 23

Related Questions