9

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

}

而且,他们两个有什么区别?或者..两者都一样?

谢谢。

4

3 回答 3

14

它们非常相似。查看 MenuInflator 的源代码,它使用上下文的唯一目的是访问资源文件。因此,特定的上下文对 MenuInflator 无关紧要。

至于内存泄漏,您参考的文章说

最明显的 [避免内存泄漏的方法] 是避免将上下文转义到其自身范围之外

除非您将 MenuInflator(或 Menu)传递给另一个类,否则它会包含在活动中并且不会泄露。

编辑

另外Activity.getMenuInflator()只是一种方便的方法new MenuInflator()。实际上这是 Activity 类中的方法:

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

通常最好使用便捷方法,因为它们允许在未来版本中更改底层实现,而无需更改代码。例如,如果将上述方法修改为返回一个缓存实例,而不是每次都创建一个新实例。

于 2011-10-15T08:28:39.417 回答
1

您应该使用MenuInflater传递给方法的实例public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)(注意第二个参数)
没有真正的区别,因为通常您会在使用完它后立即“忘记”它,但是如果您已经有一个,为什么还需要创建一个从论点?

于 2014-02-28T08:19:05.927 回答
0

从此改变:

MenuInflater inflater = getMenuInflater();

对此:

MenuInflater inflater = getActivity().getMenuInflater();
于 2017-03-25T11:15:38.227 回答