2012-04-17 73 views
17

我試圖更新的SharedPreferences值,這裏是我的代碼:SharedPreferences值不更新

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

的問題是,當我訪問這個值,它沒有返回更新後的值,它給了我一個SharedPreferences的價值。

但是,當我確認XML文件中的數據時,數據更新了。

重新啓動我的應用程序後,我得到了更新的值。所以它需要我重新啓動應用程序才能獲取更新的值。
那麼,一旦它發生變化,如何獲取這些更新值?

在此先感謝

這裏是我的全部代碼:

@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

顯示獲取值的代碼。 – 2012-04-17 06:31:36

+0

你能顯示其他代碼給出正確的值嗎?從哪裏更新值?如果您在更新共享偏好設置之前獲取值,它肯定會給出舊值。 – 2012-04-17 06:35:40

回答

62

而不是使用edit.commit();的,你應該使用edit.apply();應用將立即更新首選項對象,並將異步保存新值,以便您可以讀取最新值。


提交()

提交自己的喜好從這個編輯器的 SharedPreferences變回對象是編輯。這會自動執行 請求的修改,替換SharedPreferences中當前的任何內容。

請注意,當兩個編輯器同時修改首選項時, 最後一個調用提交獲勝。

如果您不關心返回值,並且您從應用程序的主線程使用 ,請考慮使用apply()。

適用()

提交自己的喜好從這個編輯器的 SharedPreferences變回對象是編輯。這會自動執行 請求的修改,替換SharedPreferences中當前的任何內容。

請注意,當兩個編輯器同時修改首選項時, 最後一個調用apply wins。

不像提交(),其出持久 存儲同步寫其首選項,適用()提交其對立即 SharedPreferences內存的變化,但啓動異步承諾 磁盤,你將不會被通知任何失敗。如果 上的另一位編輯員在apply()爲 仍未完成時執行常規提交(),則commit()將會阻塞,直到完成所有異步提交以及提交本身爲止。

由於SharedPreferences實例在進程內是單例,因此如果您已經忽略了返回值,則 可以安全地用apply()替換commit()的任何實例。

您不需要擔心Android組件生命週期及其與apply()寫入磁盤的交互問題 。該框架確保 在切換狀態之前,apply()完成了正在進行的磁盤寫操作。

+1

雖然apply()是一個很好的選擇,但它確實會引入必須將最小API設置爲9(2.3薑餅)的問題,根據目前的統計數據,該問題會導致大約30%的Android設備出現在那裏。我發現只要下一次檢查它時創建了SharedPreferences對象的新實例(這可能不是一個困難的代碼更改),那麼commit()就會工作 – Jag 2012-04-18 18:16:39

+0

如果apply()是異步調用的,爲什麼我讀這個代碼的最新值? https://gist.github.com/anonymous/62637e408baf273a7bc43754422c3739 – 2017-05-22 17:09:02

+0

@MaksimDmitriev「apply()立即將其更改提交到內存中的SharedPreferences,但開始異步提交到磁盤,並且不會收到任何失敗通知。」在您輸入值並應用之後立即從共享首選項中讀取數據時,它將告訴您內存中的值而不是存儲器的值。 – cuddlecheek 2017-08-10 09:00:10

1

嘗試這樣,

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

希望它會幫助你..

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


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

試試這個代碼:

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

那麼,即使我的答案在問題出現3年後,我希望這會有所幫助。這個問題似乎不是來自提交或應用,而是來自代碼結構。

讓我們來解釋一下:在智能手機上,你運行一個APP,但是你不像我們在電腦上那樣退出APP。 這意味着當您回到智能手機的菜單時,APP仍在「運行」。當你再次點擊APP圖標時,你不會重新運行APP,而只是將其喚醒。 在juned代碼中,我們可以看到他在其Create函數中調用getDefaultSharedPreferences。

因此,他在第一次運行APP時調用getDefaultSharedPreferences。但是當他在後臺設置APP,然後喚醒APP時,呼叫沒有完成。

我有同樣的問題: 我檢查我是否有我的APP的SharedPreference。如果沒有,我會提示一個表格向用戶詢問價值。 如果是,我檢查偏好的日期。如果太老,我會提示表格。 表格之後,我保存當前日期的首選項。 我注意到的是,關於SharedPreference(設置在juned的相同位置)的存在的測試僅在APP的第一次運行時完成,但在我喚醒APP時沒有完成。這意味着我無法檢查SharedPreferences的時間限制!

如何解決? 只需添加:

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

此代碼將在APP的第一次運行被稱爲而且用戶每次清醒狀態。