从活动创建新的menuInflater或getMenuInflater()?

时间:2011-10-15 06:37:47

标签: android android-menu

我正在片段内创建新的选项菜单但是在阅读之后 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);

}

并且,他们两个之间的区别是什么?或者......两个都一样吗?

感谢。

3 个答案:

答案 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();