Tôi sẽ tiếp cận vấn đề này từ một góc khác hoàn toàn.
Có một số cách thay thế để giải quyết vấn đề này.
Điều tôi làm là khi chương trình của tôi chạy lần đầu tiên, tôi khởi tạo giá trị ưu tiên được chia sẻ của mình thành giá trị kiểm tra để tôi kiểm tra xem nó có bị thay đổi hay không .
ví dụ:
editor.putInt("key", -1);
Sau đó, trong hoạt động nơi tôi đang lấy giá trị của sở thích:
int mySavedInt = this.pref.getInt("key", howIgetMyInt)
if(mySavedInt==-1){
// I know it's not my saved int :) and hasn't been set.
}
Hoặc để thực sự sử dụng một sở thích chia sẻ bản thân để xác định xem sở thích chia sẻ bạn đang cố gắng xác thực đã được cập nhật.
ví dụ:
String getStatus = pref.getString("checkMySharedPreferences", "nil");
if (getStatus.equals("true")) {
// DO something.
} else {
Toast.makeText(this, "Set your preferences",
Toast.LENGTH_SHORT).show();
}
Sau đó, khi bạn đặt tùy chọn chia sẻ của bạn, bạn có thể thiết lập giá trị này thành "true":
editor.putString("checkMySharedPreferences", "true");
editor.commit();
gợi ý khác là để đảm bảo bạn xác nhận bất kỳ dữ liệu trước khi cập nhật sở thích chia sẻ của bạn. Bằng cách đó, các tùy chọn được chia sẻ sẽ không được đặt nếu dữ liệu không hợp lệ.
if(my data is valid){
my shared preferences
commit
}
Đề xuất cuối cùng là thực hiện kiểm tra tuần hoàn (vì bạn không an toàn trong quá trình) và khi bạn nhận dữ liệu cho tùy chọn được chia sẻ và cam kết. Kiểm tra xem đầu vào của người dùng có bằng tùy chọn được chia sẻ mới hay không. Mặc dù tôi không thấy điều này khi cần thiết.
Và để đăng nhập các sự kiện này, chỉ cần thêm bạn Đăng nhập các dòng nếu có.
Ngoài ra, chỉ cần một lưu ý phụ, tôi không nghĩ rằng thực tế tốt để ném ngoại lệ nếu chúng không được đặt, tôi tin rằng quản lý luồng chương trình có thể được xử lý tốt hơn với các câu lệnh có điều kiện. một lỗi runtime
. Lưu xử lý lỗi trong khi xác thực đầu vào của người dùng.
Trả về true nếu các giá trị mới được ghi thành công thành lưu trữ liên tục. Hãy xem: http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#commit() –
và tôi nghĩ rằng nó trả về false khi tệp bị hỏng hoặc bất kỳ sự cố nào với I/O .. nhưng những vấn đề này xảy ra rất hiếm khi ... – Moinkhan
xem xét nếu u thay đổi kiểu dữ liệu cho một khóa tại một số điểm. Nó chắc chắn sẽ trả về false. – Randroid