2011-10-15 26 views
9

tôi là tạo ra tùy chọn menu mới bên trong mảnh nhưng sau khi đọc http://developer.android.com/resources/articles/avoiding-memory-leaks.html mà nói với nó là tốt hơn để sử dụng bối cảnh ứng dụng hơn bối cảnh hoạt động, tôi sợ để sử dụng getActivity(). GetMenuInflater()tạo menu mớiInflater hoặc getMenuInflater() từ hoạt động?

Vì vậy, , trên thực tế cái nào tốt hơn

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    MenuInflater mInflater = new MenuInflater(getActivity().getApplicationContext()); 
    mInflater.inflate(R.menu.simple_menu, menu); 
} 

Hoặc hoạt động một cuộc gọi

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    MenuInflater mInflater = getActivity().getMenuInflater(); 
    mInflater.inflate(R.menu.simple_menu, menu); 

} 

và, những gì là sự khác biệt giữa hai người 'em? hoặc..both chỉ là giống nhau?

Cảm ơn.

Trả lời

13

Chúng rất giống nhau. Nhìn qua nguồn của MenuInflator, điều duy nhất nó sử dụng ngữ cảnh là truy cập các tệp tài nguyên. Vì vậy, bối cảnh cụ thể không quan trọng với MenuInflator.

Đối với rò rỉ bộ nhớ, bài viết bạn tham khảo nói

Rõ ràng nhất [cách để tránh rò rỉ bộ nhớ] là để tránh thoát những bối cảnh bên ngoài phạm vi riêng của mình

Trừ khi bạn chuyển MenuInflator (hoặc Menu) đến một lớp khác, sau đó nó được chứa trong hoạt động và sẽ không bị rò rỉ.

EDIT

Ngoài Activity.getMenuInflator() chỉ là một phương pháp thuận tiện cho new MenuInflator(). Trên thực tế, đây là phương thức bên trong lớp Hoạt động:

public MenuInflater getMenuInflater() { 
    return new MenuInflater(this); 
} 

Tốt hơn nên sử dụng các phương pháp tiện lợi vì chúng cho phép triển khai cơ bản thay đổi trong các phiên bản sau mà không cần phải thay đổi mã của bạn. Ví dụ, nếu phương thức trên được sửa đổi để trả về một cá thể được lưu trong bộ nhớ cache thay vì tạo một thể hiện mới mỗi lần.

+0

yeah, nhưng tạo "mới" menuInflater âm thanh như nó sẽ ăn bộ nhớ nhiều hơn "nhận" menuInflater ... và bạn nói nó sẽ không bị rò rỉ nếu tôi không vượt qua menuInflator đến một lớp khác, tôi gọi nó bên trong lớp fragment không phải là hoạt động mảnh, vì vậy nếu tôi gọi getMenuInflator, nó sẽ không "gọi trình đơnInflator từ một lớp khác" ? –

+0

@ GAO-tsukai Tôi đã bỏ lỡ câu hỏi của bạn về phương pháp này. Tôi đã cập nhật câu trả lời của mình cho phù hợp. – spatulamania

+0

cảm ơn, bây giờ tôi cảm thấy tôi thực sự cần phải nhìn thấy nguồn Android ... –

1

Bạn nên sử dụng MenuInflater dụ được truyền cho phương thức public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) (chú ý đối số thứ 2)
Không có khác biệt thực sự, bởi vì thông thường bạn sẽ "quên" nó càng sớm càng sử dụng xong nó, nhưng tại sao bạn sẽ cần để tạo một cái nếu bạn đã có một từ các đối số?

0

Thay đổi từ này:

MenuInflater inflater = getMenuInflater(); 

Để này:

MenuInflater inflater = getActivity().getMenuInflater(); 
Các vấn đề liên quan