2015-07-13 27 views
9

Đi qua một số nguồn "tốt" được cho là để tìm hiểu chi tiết và thủ thuật xử lý ngữ cảnh trong Android Tôi đã gặp một mô hình nhiều lần hiểu không.Tại sao sử dụng ContextWrapper trực tiếp trong Hoạt động thay vì bối cảnh ngầm từ "này"

Lợi thế của việc sử dụng ContextWrapper khi bạn có thể sử dụng tốt bối cảnh tiềm ẩn bằng cách nào?

Ví dụ tại sao sử dụng sau đây trong một phương thức hoạt động (được định nghĩa trực tiếp trong một lớp học Hoạt động)

... 
ContextWrapper cw = new ContextWrapper(getApplicationContext()) 
File filesDir = cw.getFilesDir(); 
... 

Thay vì chỉ

... 
File filesDir = getFilesDir(); 
... 

mặc dù getFilesDir() được định nghĩa trong lớp ContextWrapper Activity vẫn là lớp con của ContextWrapper, do đó bạn có thể truy cập trực tiếp vào phương thức này.

Vì vậy, vấn đề tiềm năng (mà tôi không nhìn thấy) thực hiện điều này thêm địa chỉ phức tạp?

+0

'Application' kéo dài' ContextWrapper' cũng. – tynn

Trả lời

6

Tôi muốn nói (và tôi có thể sai) rằng trong trường hợp (và ngữ cảnh) bạn trình bày có thể không tạo sự khác biệt. getApplicationContext().getFilesDir() có thể được sử dụng dễ dàng.

Tuy nhiên, tôi tin rằng ContextWrapper có thể hữu ích trong các trường hợp khác. Từ những gì tôi hiểu, đây là mẫu bộ điều hợp. Bạn có thể muốn cung cấp hành vi khác nhau chỉ cho các phương pháp nhất định trong khi proxy tất cả các khác để tham chiếu bối cảnh ban đầu bạn vượt qua trong

Kiểm tra đoạn mã này từ RemoteViews:.

// RemoteViews may be built by an application installed in another 
// user. So build a context that loads resources from that user but 
// still returns the current users userId so settings like data/time formats 
// are loaded without requiring cross user persmissions. 
final Context contextForResources = getContextForResources(context); 
Context inflationContext = new ContextWrapper(context) { 
    @Override 
    public Resources getResources() { 
     return contextForResources.getResources(); 
    } 
    @Override 
    public Resources.Theme getTheme() { 
     return contextForResources.getTheme(); 
    } 
}; 
Các vấn đề liên quan