我正在片段内创建新的选项菜单但是在阅读之后 http://developer.android.com/resources/articles/avoiding-memory-leaks.html 据说最好使用上下文应用而不是上下文活动,我害怕使用getActivity()。getMenuInflater()
所以,实际上哪一个更好
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
MenuInflater mInflater = new MenuInflater(getActivity().getApplicationContext());
mInflater.inflate(R.menu.simple_menu, menu);
}
或一次通话活动
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
MenuInflater mInflater = getActivity().getMenuInflater();
mInflater.inflate(R.menu.simple_menu, menu);
}
并且,他们两个之间的区别是什么?或者......两个都一样吗?
感谢。
答案 0 :(得分:14)
他们非常相似。浏览MenuInflator的源代码,它唯一使用上下文的是访问资源文件。因此,具体上下文与MenuInflator无关。
至于内存泄漏,你引用的文章说
最明显的[避免内存泄漏的方法]是避免逃避 超出自身范围的背景
除非您将MenuInflator(或Menu)传递给另一个类,否则它将包含在活动中并且不会泄露。
修改强>
此外,Activity.getMenuInflator()
只是new MenuInflator()
的便捷方法。实际上这是Activity类中的方法:
public MenuInflater getMenuInflater() {
return new MenuInflater(this);
}
通常最好使用便捷方法,因为它们允许在未来版本中更改底层实现,而无需更改代码。例如,如果修改上述方法以返回缓存实例,而不是每次都创建一个新实例。
答案 1 :(得分:1)
您应该使用传递给方法MenuInflater
的{{1}}实例(注意第二个参数)
没有什么真正的区别,因为通常一旦你完成使用它就会“忘记”它,但是如果你已经从参数中获得了它,为什么还需要创建一个呢?
答案 2 :(得分:0)
从此改变:
MenuInflater inflater = getMenuInflater();
对此:
MenuInflater inflater = getActivity().getMenuInflater();