2012-11-10 15 views
10

Sto tentando di utilizzare SharedPreferences per memorizzare alcune impostazioni utente per la mia app. Ho questo codice nel mio metodo Activity.onCreate:StrictModeDiskReadViolation when

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

ma mi dà questo errore (è la getBoolean che genera l'errore):

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

e il risultato è che il valore sia non leggo e ho anche lo stesso errore quando provo a scrivere ai SharedPreferences con questo codice (è il commit che genera l'errore):

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

le uniche risposte per questo errore che posso trovare è di circa un st avviso di modalità rict, ma il mio codice in realtà non riesce a leggere/scrivere i dati chiave/valore SharedPreferences.

+0

Eventuali duplicati di [? Dovrebbe accesso SharedPreferences essere fatto fuori dal thread UI] (http://stackoverflow.com/questions/4371273/should-accessing- sharedpreferences-be-done-off-the-ui-thread) – rds

risposta

11

È necessario eseguire le operazioni fileSystem su un thread separato, quindi l'errore andrà via.

si può anche spegnere lo StrictMode (ma io non sono raccomandando che)

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

Ok ora creo una discussione o n Activity.onCreate e questo thread legge le proprietà all'avvio e controlla le proprietà dirty e scrive quelle se necessario, e interrompo il thread su Activity.onPause e ricominciare su Activity.onResume. Sembra giusto? – Neigaard

+0

Puoi provare, faccelo sapere. – Frank

+1

Funziona di sicuro, e ho provato che il thread non è vivo quando l'app è in background, quindi sembra buono. Volevo solo sapere se i maghi pensavano che suonasse come un buon modo per farlo;) – Neigaard

2

Se hai reattiva (RxJava) configurato nel progetto Android, è possibile usufruire delle sue proprietà come programma un compito su una pianificazione I/O specifiche, per esempio:

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