2012-04-17 24 views
17

Sto cercando di aggiornare i valori di SharedPreferences, qui è il mio codice:SharedPreferences non viene aggiornato

edit = PreferenceManager.getDefaultSharedPreferences(this).edit(); 
edit.putString(Settings.PREF_USERNAME+"",txtuser); 
edit.putString(Settings.PREF_PASSWORD+"",txtpass); 
edit.commit();" 

Il problema è che quando sto Accedendo a questo valore, esso non restituisce valori aggiornati, mi dà un valore di SharedPreferences.

Ma quando si confermano i dati nel file XML, i dati aggiornati in questo.

E dopo aver riavviato la mia applicazione sto ottenendo quei valori aggiornati. Quindi mi richiede di riavviare l'applicazione per ottenere valori aggiornati.
Quindi, come ottenere quei valori aggiornati una volta che cambia?

Grazie in anticipo

Ecco tutto il mio codice:

@Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.main); 
     ctx=this; 

      status=PreferenceManager.getDefaultSharedPreferences(this).getString(Settings.PREF_STATUS, Settings.DEFAULT_STATUS);// get old value 
     submit.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

        on(ctx,true);// function will call and value is updated 

       } 
      }});  

    status=PreferenceManager.getDefaultSharedPreferences(this).getString(Settings.PREF_STATUS, Settings.DEFAULT_STATUS);// this should give me a updated value but gives old value 

    } 
    public static boolean on(Context context) { 
     return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(Settings.PREF_ON, Settings.DEFAULT_ON); 
    } 

    public static void on(Context context,boolean on) { 
      if (on) Receiver.engine(context).isRegistered(); // 
     } 




**********in reciver file*********** 
public void isRegistered) { 
     Editor edit = PreferenceManager.getDefaultSharedPreferences(Receiver.mContext).edit(); 
     edit.putString(Settings.PREF_STATUS+"","0"); 
     edit.commit(); 
} 
+1

mostra il codice per ottenere il valore. –

+0

Puoi mostrare altro codice che fornisce valori corretti. E da dove stai aggiornando i valori? Se stai ricevendo dei valori prima di aggiornare le preferenze condivise, darà sicuramente dei vecchi valori. –

risposta

62

Invece di usare edit.commit();, è necessario utilizzare edit.apply();. Applicare aggiornerà all'istante l'oggetto preferenza e salverà i nuovi valori in modo asincrono, consentendo così di leggere gli ultimi valori.


commit()

confermare le preferenze cambiano indietro da questo Editor per i SharedPreferences oggetto è la modifica. Questo esegue atomicamente le modifiche richieste , sostituendo qualsiasi cosa sia attualmente nelle Visualizzazioni condivise .

Si noti che quando due editor modificano le preferenze allo stesso tempo, vince l'ultimo da chiamare commit.

Se non ti interessa il valore restituito e lo stai utilizzando da thread principale dell'applicazione, prendere in considerazione l'utilizzo di apply().

applicare()

confermare le preferenze cambiano indietro da questo Editor per i SharedPreferences oggetto è la modifica. Questo esegue atomicamente le modifiche richieste , sostituendo qualsiasi cosa sia attualmente nelle Visualizzazioni condivise .

Si noti che quando due editor modificano le preferenze allo stesso tempo, l'ultimo da chiamare applica vince.

A differenza di commit(), che scrive le sue preferenze verso persistente stoccaggio in modo sincrono, applicare() commette le sue modifiche al SharedPreferences immediatamente in memoria, ma avvia un asincrono impegnano a disco e non verrà notificato di eventuali guasti. Se un altro editor su condivide questo oggetto con un commit regolare() mentre un apply() è ancora in sospeso, il commit() si bloccherà fino a quando tutti i commit asincroni non saranno completati e commit stesso.

Come istanze SharedPreferences sono singleton all'interno di un processo, è sicuro sostituire qualsiasi istanza di commit() con apply() se si fosse già ignorando il valore restituito.

Non è necessario preoccuparsi dei cicli di vita dei componenti Android e della loro interazione con apply() scrivendo sul disco. Il framework si assicura che le scritture su disco in volo di da apply() siano complete prima di cambiare stato.

+1

Mentre apply() è una buona alternativa, introduce il problema di dover impostare la tua API minima su 9 (2.3 Gingerbread) che, in base alle statistiche attuali, elimina circa il 30% di tutti i dispositivi Android.Ho trovato che commit() funziona fino a quando la prossima volta che lo controlli stai creando una nuova istanza dell'oggetto SharedPreferences che potrebbe non essere un cambiamento di codice difficile – Jag

+0

se 'apply()' è chiamato in modo asincrono, perché leggo il valore più recente se questo codice? https://gist.github.com/anonymous/62637e408baf273a7bc43754422c3739 –

+0

@MaksimDmitriev "apply() conferma immediatamente le sue modifiche alle SharedPreferences in memoria ma avvia un commit asincrono su disco e non ti verrà notificato alcun errore." Quando leggi dalle preferenze condivise immediatamente dopo aver inserito un valore e applicato, ti dice il valore dalla memoria e non dalla memoria. – cuddlecheek

1

Prova in questo modo,

public SharedPreferences prefs; 
SharedPreferences.Editor editor = prefs.edit(); 
editor.putString(Settings.PREF_USERNAME+"", txtuser); 
editor.putString(Settings.PREF_PASSWORD+"", entered_name); 
editor.commit();  
1

spero che vi aiuterà a ..

SharedPreferences mypref = PreferenceManager.getDefaultSharedPreferences(this); 
SharedPreferences.Editor prefsEditr = mypref.edit(); 
prefsEditr.putString("Userid", UserId); 
prefsEditr.commit(); 


String task1 = mypref.getString("Userid", ""); 
1

provare questo codice:

SharedPreferences edit = PreferenceManager.getDefaultSharedPreferences(this); 
SharedPreferences.Editor editor1 = edit.edit(); 
editor.putString(Settings.PREF_USERNAME + "", txtuser); 
editor.putString(Settings.PREF_PASSWORD + "", entered_name); 
editor.commit(); 
0

Bene, anche se la mia risposta è arrivata 3 anni dopo la domanda, spero che possa essere d'aiuto. Il problema non sembra provenire da commit o apply ma dalla struttura del codice.

Spieghiamo: su uno smartphone, si esegue un'APP ma non si esce dall'app come facciamo sui computer. Questo significa che quando si ritorna al menu dello smartphone, l'APP è ancora "in esecuzione". Quando "fai nuovamente clic" sull'icona di APP, non riesegui l'APP ma semplicemente la riattivi. In juned code, possiamo vedere che chiama getDefaultSharedPreferences nella sua funzione Create.

Quindi chiama getDefaultSharedPreferences quando esegue la prima volta l'APP. Ma quando imposta l'APP su sfondo e poi riattiva l'APP, la chiamata non viene eseguita.

Ho avuto lo stesso problema: Controllo se ho SharedPreference per la mia APP. Altrimenti, chiedo un modulo per chiedere valore all'utente. Se sì, controllo la data delle preferenze. Se è troppo vecchio, richiedo il modulo. Dopo il modulo, salvi le preferenze con la data corrente. Quello che ho notato è che il test sull'esistenza di SharedPreference (che è stato impostato nello stesso posto di quello di juned) è stato eseguito solo alla prima esecuzione dell'APP ma non quando ho svegliato l'APP. Questo significa che non sono riuscito a controllare il limite di tempo delle mie SharedPreferences!

Come risolvere quello? Basta aggiungere:

  @Override 
      public void onResume(){ 
      super.onResume(); 
     // And put the SharedPreferences test here 
      } 

Questo codice sarà chiamato in un primo run della APP, ma anche ogni volta che l'utente svegli esso.

Problemi correlati