2012-05-08 29 views
5

Tôi mới dùng Android ...Vẫn còn nhầm lẫn về Ngữ cảnh

Thời gian tối đa Tôi phải đối mặt với lớp context đôi khi khiến tôi bối rối. Ở một số nơi, nó sử dụng context, ở đâu đó được gọi bằng getApplicationContext(), getContext(), getBaseContext().

Tôi đã cố gắng làm cho tôi hiểu điều đó từ trang web này, http://www.developer.android.com/, nhưng rất khó hiểu.

Trả lời

2

Trên Android, một ngữ cảnh được sử dụng cho nhiều thao tác nhưng chủ yếu là để tải và truy cập tài nguyên. Đây là lý do tại sao tất cả các widget nhận được một tham số Context trong constructor của chúng. Trong một ứng dụng Android thông thường, bạn thường có hai loại Ngữ cảnh, Hoạt động và Ứng dụng. Nó thường là người đầu tiên mà nhà phát triển chuyển đến các lớp và phương thức cần có một bối cảnh:

Bạn có thể lấy bối cảnh bằng cách gọi getApplicationContext(), getContext(), getBaseContext() hoặc (khi ở trong lớp hoạt động).

sử dụng tiêu biểu của ngữ cảnh:

  1. Tạo đối tượng mới: Tạo quan điểm mới, adapter, người nghe:

    TextView tv = TextView mới (getContext()); ListAdapter adapter = new SimpleCursorAdapter (getApplicationContext(), ...);

  2. Truy cập Chuẩn Tài nguyên chung: Các dịch vụ như LAYOUT_INFLATER_SERVICE, SharedPreferences:.

    context.getSystemService (LAYOUT_INFLATER_SERVICE)
    getApplicationContext() getSharedPreferences (tên, chế độ);

  3. Truy cập Components Mặc nhiên:.. Về nhà cung cấp nội dung, chương trình phát sóng , ý định

    getApplicationContext() getContentResolver() truy vấn (uri, ...);

bạn phải cẩn thận khi sử dụng bối cảnh vì maintaning nó có thể gây ra rò rỉ bộ nhớ

Nói tóm lại, để tránh rò rỉ bộ nhớ bối cảnh liên quan đến, hãy nhớ những điều sau đây:

  1. Đỗ không giữ tham chiếu lâu dài đối với hoạt động theo ngữ cảnh (tham chiếu đối với hoạt động phải có cùng chu kỳ sống như hoạt động chính nó)
  2. Hãy thử sử dụng bối cảnh ứng dụng thay vì một bối cảnh hoạt động
  3. Tránh các lớp bên trong không tĩnh trong một hoạt động nếu bạn không kiểm soát chu kỳ cuộc sống của họ, sử dụng một lớp bên trong tĩnh và thực hiện một tài liệu tham khảo yếu cho hoạt động bên trong. Giải pháp cho vấn đề này là sử dụng một lớp bên trong tĩnh với một WeakReference đến lớp bên ngoài, as done trong ViewRoot và lớp bên trong W của nó ví dụ
  4. Một nhà sưu tập rác không phải là một bảo hiểm chống lại bộ nhớ bị rò rỉ
Các vấn đề liên quan