2012-07-19 62 views
35

Tôi đang sử dụng một số SharedPreferences để lưu trữ dữ liệu trong ứng dụng của mình. Một số tùy chọn được sử dụng trong rất nhiều hoạt động.SharedPreferences bối cảnh ứng dụng và bối cảnh hoạt động

Tôi biết rằng SharedPreferences được hỗ trợ nội bộ bởi bản đồ để truy cập đọc nhanh và được ghi vào sdcard khi cài đặt được thay đổi.

Tôi tự hỏi đó là cách tốt hơn nếu một sharedpreference được truy cập bởi nhiều activies:

  1. Nhanh chóng nó trong mọi hoạt động sử dụng bối cảnh hoạt động.
  2. Thực hiện nó trong mọi hoạt động, nhưng sử dụng ngữ cảnh ứng dụng.
  3. Đặt nó trong ví dụ: lớp Ứng dụng và khởi tạo nó chỉ một lần ở đó, tương tự như một singleton.

Nếu tôi sử dụng 1. giải pháp có đối tượng sharedpreference cho mọi hoạt động không? Và bản đồ nội bộ của sharedpreference có bị phá hủy khi hoạt động bị phá hủy không?

Nếu tôi sử dụng 2. giải pháp sẽ chỉ có một trường hợp mặc dù tôi gọi getSharedPreferences trong mọi hoạt động? Và bản đồ nội bộ có trong bộ nhớ miễn là ứng dụng còn sống không?

Hy vọng rằng ai đó biết cách Android xử lý nội bộ.

+0

Tôi muốn giới thiệu lựa chọn ba, bạn có thể truy cập từ tất cả các hoạt động của mình và bạn chỉ phải thực hiện một lần đọc. – Joel

Trả lời

55

Đó là giá trị xem xét sources đó cho thấy một ví dụ Context (có thể là một Activity hoặc một Application chẳng hạn) chia sẻ cùng một bản đồ tĩnh HashMap<String, SharedPreferencesImpl>.

Vì vậy, bất cứ khi nào bạn yêu cầu một phiên bản SharedPreferences bằng cùng tên qua Context.getSharedPreferences(name, mode) bạn sẽ nhận được cùng một ví dụ vì nó lần đầu tiên kiểm tra xem bản đồ có chứa SharedPreferences thể hiện cho khóa hay không. Khi cá thể SharedPreferences được tải, nó sẽ không được tải lại, nhưng được lấy từ bản đồ để thay thế. Vì vậy, nó thực sự không quan trọng theo cách bạn đi, điều quan trọng là sử dụng cùng một tên để có được cùng một prefs từ các phần khác nhau của ứng dụng. Tuy nhiên việc tạo một "điểm truy cập" duy nhất cho các prefs có thể là một điểm cộng. Vì vậy, nó có thể là một wrapper singleton trên các prefs instantiated trong Application.onCreate().

+0

+1 Ngay cả khi tôi tin như vậy .. Cảm ơn bạn đã phê chuẩn – Rasmus

7

Tôi thích sử dụng lớp học singleton cho tùy chọn, tùy chọn khởi tạo một lần theo ngữ cảnh ứng dụng. tạo các phương thức getter và setter (get/put) để thêm, cập nhật và xóa dữ liệu.

Bằng cách này, nó sẽ tạo ra một lần và có thể dễ đọc hơn, có thể tái sử dụng được.

+0

Ngoài ra nó là tốt khi một ứng dụng trả về từ yêu cầu HTTP. Trong trường hợp này một ngữ cảnh (hoạt động) có thể không tồn tại, do đó context.getSharedPreferences sẽ dẫn đến NPE. Khi sử dụng một singleton điều này sẽ không xảy ra. – CoolMind

11

SharedPreferences được quản lý nội bộ bởi Android dưới dạng đơn. Bạn có thể có được càng nhiều trường hợp như bạn muốn sử dụng:

context.getSharedPreferences(name, mode); 

miễn là bạn sử dụng cùng một tên , bạn sẽ luôn nhận được cùng một dụ. Do đó không có vấn đề đồng thời.

Các vấn đề liên quan