2014-06-18 26 views
6

Ho trovato tutte le risposte qui e ho provato tutte le soluzioni, tuttavia le mie preferenze condivise non sono persistenti.Preferenze condivise non persistenti dopo il riavvio dell'app

Ecco il mio codice:

public static void setActivated(boolean activated) { 
    SharedPreferences sp = Utils.getContext().getSharedPreferences(
      USER_PREFS, Context.MODE_PRIVATE); 
    SharedPreferences.Editor editor = sp.edit(); 
    editor.putBoolean(ASD, activated); 
    editor.commit(); 
} 

public static boolean isActivated() { 
    SharedPreferences sp = Utils.getContext().getSharedPreferences(USER_PREFS, Context.MODE_PRIVATE); 
    return sp.getBoolean(ASD, true); 
} 

ho provato anche:

editor.clear(); 
editor.put .. 
editor.commit(); 

Ho anche provato con

editor.apply(); 

Ho anche provato con entrambi .Applicare() e .commit() e senza fortuna.

Un'altra idea era quella di provare a utilizzare una modalità diversa per i file:

...getSharedPreferences(USER_PREFS, Context.MODE_MULTI_PROCESS); 

Il problema è che i valori salvati non sono persistenti. Se chiudo l'app e la riapri i valori sono tutti sbagliati.

Qualcuno ha qualche idea? Vorrei anche ricordare che il problema riguarda solo alcuni dispositivi, ad esempio l'HTC One S, il Samsung Galaxy S3 (ho provato su un altro S3 e ha funzionato perfettamente).

MODIFICA: chiamo il salvataggio su un pulsante click listener e chiamo isActivated quando carico il frammento (dopo onViewCreated()).

Grazie!

+0

vedere questo: http: //stackoverflow.com/questions/23654853/radiobuttons-and-spinners-in-shared-preferences/23655104#23655104 –

+0

avendo lo stesso problema ... ho notato che il problema succede solo se riavvio l'app mentre il processo è ancora attivo (secondo DDMS) - in questo caso sembra che venga utilizzato un file di preferenze separato. Se uccido il processo in DDMS e riavvio in seguito - nessun problema ... – Lez77

risposta

2
public abstract SharedPreferences.Editor clear() 

Aggiunto in API di livello 1 Mark nell'editor per rimuovere tutti i valori dalle preferenze. Una volta chiamato il commit, le uniche restanti preferenze saranno quelle che hai definito in questo editor. Notare che quando ripristina le preferenze, la cancellazione viene effettuata per prima, indipendentemente dal fatto che si sia chiamato clear prima o dopo i metodi put su questo editor.

Restituzioni Restituisce un riferimento allo stesso oggetto Editor, in modo che sia possibile effettuare chiamate in serie .

Nel mio utente classe preferenze mi è stato sempre un valore nullo su alcune altre stringhe e il mio codice è stato qualcosa di simile:

SharedPreferences sp = Utils.getContext() 
    .getSharedPreferences(USER_PREFS, Context.MODE_PRIVATE); 
SharedPreferences.Editor editor = sp.edit(); 
if (session != null && !"".equals(session)) { 
    sessionId = session; 
    editor.putString(SESSION, sessionId).commit(); 
} else { 
    sessionId = null; 
    editor.clear().commit(); 
} 

Il editor.clear() stato, ossia tutte le altre mie commit!

+0

In che modo questo aiuta? L'autore ha detto che aveva provato con e senza editor.clear(). Ho lo stesso problema anche senza chiamare editor.clear() ... – Lez77

0

non so perché, ma si sta lavorando da solo mettendo il codice di preferenze all'interno del compito asincrona :

prefss = getSharedPreferences(ACCOUNT_PREFS_NAME, MODE_MULTI_PROCESS); 
new AsyncSave(favNamesList).execute(); 
private static class AsyncSave extends AsyncTask<Void, Void, Boolean> { 
    String favNamesList; 

    AsyncSave(String favNamesList) { 
     this.favNamesList = favNamesList; 
    } 

    @Override 
    protected Boolean doInBackground(Void... params) { 
     prefss.edit().putString("favNamesList", strings).apply(); 
     return null; 
    } 
}