2012-04-17 13 views
17

Tôi cố gắng để cập nhật các giá trị của SharedPreferences, đây là mã của tôi:SharedPreferences không được cập nhật

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

Vấn đề là khi tôi truy cập vào các giá trị này, nó không phải là trở về giá trị cập nhật, nó mang lại cho tôi một giá trị của SharedPreferences.

Nhưng khi tôi xác nhận dữ liệu trong XML tệp, dữ liệu được cập nhật trong đó.

Và sau khi khởi động lại ứng dụng của tôi, tôi nhận được các giá trị được cập nhật đó. Vì vậy, nó đòi hỏi tôi phải khởi động lại ứng dụng để có được các giá trị cập nhật.
Vì vậy, cách nhận các giá trị được cập nhật đó khi thay đổi?

Cảm ơn trước

Dưới đây là toàn bộ mã của tôi:

@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

hiển thị mã nhận giá trị. –

+0

Bạn có thể hiển thị mã khác cung cấp các giá trị chính xác không. Và từ nơi bạn đang cập nhật các giá trị? Nếu bạn nhận được các giá trị trước khi cập nhật các tùy chọn được chia sẻ, nó chắc chắn sẽ cung cấp các giá trị cũ. –

Trả lời

62

Thay vì sử dụng edit.commit();, bạn nên sử dụng edit.apply();. Áp dụng sẽ cập nhật đối tượng ưu tiên ngay lập tức và sẽ lưu các giá trị mới không đồng bộ, vì vậy cho phép bạn đọc các giá trị mới nhất.


cam kết()

Commit sở thích của bạn thay đổi lại từ biên tập viên này cho SharedPreferences đối tượng đó là chỉnh sửa. Việc này thực hiện một cách nguyên tử các yêu cầu sửa đổi được yêu cầu , thay thế bất kỳ nội dung nào hiện có trong SharedPreferences.

Lưu ý rằng khi hai biên tập viên đang sửa đổi tùy chọn cùng một lúc, người cuối cùng gọi cam kết thắng.

Nếu bạn không quan tâm đến giá trị trả về và bạn đang sử dụng điều này từ chủ đề chính của ứng dụng, hãy cân nhắc sử dụng hàm apply() thay thế.

áp dụng()

Commit sở thích của bạn thay đổi lại từ biên tập viên này cho SharedPreferences đối tượng đó là chỉnh sửa. Việc này thực hiện một cách nguyên tử các yêu cầu sửa đổi được yêu cầu , thay thế bất kỳ nội dung nào hiện có trong SharedPreferences.

Lưu ý rằng khi hai biên tập viên đang sửa đổi tùy chọn cùng một lúc, người cuối cùng gọi chiến thắng áp dụng.

Không giống như cam kết(), mà viết sở thích của nó ra dai dẳng lưu trữ đồng bộ, áp dụng() cam kết thay đổi của nó vào trong bộ nhớ SharedPreferences ngay lập tức nhưng bắt đầu một không đồng bộ cam kết đĩa và bạn sẽ không được thông báo về bất kỳ thất bại nào. Nếu một trình soạn thảo khác trên SharedPreferences này thực hiện cam kết thông thường() trong khi áp dụng() là vẫn còn tồn tại, cam kết() sẽ chặn cho đến khi tất cả các cam kết không đồng bộ là hoàn thành cũng như cam kết.

Vì trường hợp SharedPreferences là đơn trong quá trình, nó là an toàn để thay thế bất kỳ trường hợp commit nào() có áp dụng() nếu bạn là đã bỏ qua giá trị trả về.

Bạn không cần phải lo lắng về vòng đời thành phần Android và tương tác của mình với áp dụng() ghi vào đĩa. Khung làm cho chắc chắn đĩa trên máy bay ghi từ áp dụng() hoàn thành trước khi chuyển đổi trạng thái.

+1

Trong khi áp dụng() là một lựa chọn tốt, nó giới thiệu vấn đề phải thiết lập API tối thiểu là 9 (2.3 Gingerbread), theo thống kê hiện tại, chiếm khoảng 30% tất cả các thiết bị Android trên mạng.Tôi thấy rằng commit() hoạt động miễn là lần sau bạn kiểm tra nó, bạn đang tạo một thể hiện mới của đối tượng SharedPreferences mà có thể không phải là một sự thay đổi mã khó khi – Jag

+0

nếu 'apply()' được gọi là không đồng bộ, tại sao tôi đọc giá trị mới nhất nếu mã này? https://gist.github.com/anonymous/62637e408baf273a7bc43754422c3739 –

+0

@MaksimDmitriev "apply() cam kết các thay đổi của nó trong SharedPreferences trong bộ nhớ ngay lập tức nhưng bắt đầu cam kết không đồng bộ vào đĩa và bạn sẽ không được thông báo về bất kỳ lỗi nào." Khi bạn đọc từ các tùy chọn được chia sẻ ngay lập tức sau khi bạn đặt một giá trị và áp dụng nó, nó sẽ cho bạn biết giá trị từ bộ nhớ chứ không phải bộ nhớ. – cuddlecheek

1

Hãy thử như thế này,

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

hy vọng nó sẽ giúp bạn ..

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


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

Hãy thử mã này:

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

Vâng, ngay cả khi câu trả lời của tôi là 3 năm sau câu hỏi, tôi hy vọng nó sẽ giúp ích. Vấn đề dường như không đến từ cam kết hoặc áp dụng nhưng từ cấu trúc mã.

Hãy giải thích: trên điện thoại thông minh, bạn chạy APP nhưng bạn không thoát APP như chúng tôi thực hiện trên máy tính. Điều này có nghĩa là khi bạn quay lại menu của điện thoại thông minh, APP vẫn đang "chạy". Khi bạn "bấm" một lần nữa vào biểu tượng APP, bạn không chạy lại APP nhưng chỉ tỉnh táo nó. Trong mã juned, chúng ta có thể thấy anh ta gọi getDefaultSharedPreferences bên trong hàm Create của mình.

Vì vậy, anh gọi getDefaultSharedPreferences khi chạy lần đầu tiên APP. Nhưng khi ông đặt APP trên nền và sau đó tỉnh táo APP, cuộc gọi không được thực hiện.

Tôi đã gặp sự cố tương tự: Tôi kiểm tra xem tôi có SharedPreference cho APP của mình không. Nếu không, tôi nhắc nhở một biểu mẫu để hỏi giá trị cho người dùng. Nếu có, tôi kiểm tra ngày của các sở thích. Nếu quá già, tôi nhắc nhở mẫu đơn. Sau biểu mẫu, tôi lưu các tùy chọn với ngày hiện tại. Những gì tôi nhận thấy là các thử nghiệm về sự tồn tại của SharedPreference (được đặt tại cùng một vị trí so với một trong juned) đã được thực hiện chỉ ở lần đầu tiên chạy APP nhưng không phải khi tôi tỉnh táo APP. Điều này có nghĩa là tôi không thể kiểm tra thời gian giới hạn của SharedPreferences của tôi!

Cách giải quyết điều đó? Chỉ cần thêm:

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

Mã này sẽ được gọi vào lần chạy đầu tiên của APP nhưng cũng mỗi khi người dùng tỉnh táo.