создать новый MenuInflater или getMenuInflater() из activity?

#android #android-menu

#Android #android-меню

Вопрос:

Я создаю новое меню опций внутри фрагмента, но после прочтения 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);

}
  

и в чем разница между ними двумя? или .. оба они одинаковы?

Спасибо.

Ответ №1:

Они очень похожи. Просматривая источник MenuInflator, единственное, для чего он использует контекст, — это доступ к файлам ресурсов. Таким образом, конкретный контекст не имеет значения для MenuInflator.

Что касается утечек памяти, в статье, на которую вы ссылаетесь, говорится

Самый очевидный [способ избежать утечек памяти] — избегать выхода контекста за пределы его собственной области

Если вы не передадите MenuInflator (или Menu) в другой класс, он будет содержаться в activity и не будет передан.

Редактировать

Кроме того Activity.getMenuInflator() , это просто удобный метод для new MenuInflator() . На самом деле это метод внутри класса Activity:

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

Обычно лучше использовать удобные методы, поскольку они позволяют изменять базовую реализацию в будущих версиях без необходимости изменения кода. Например, если вышеуказанный метод изменен, чтобы возвращать кэшированный экземпляр вместо создания нового каждый раз.

Комментарии:

1. да, но создание «нового» MenuInflater звучит так, как будто оно будет потреблять больше памяти, чем «получить» MenuInflater… и вы сказали, что это не будет утечка, если я не передам menuInflator другому классу, я вызываю это внутри класса фрагмента, а не фрагмента activity, поэтому, если я вызову getMenuInflator, не будет ли это «вызвать menuInflator из другого класса»?

2. @GAO-tsukai Я пропустил ваш вопрос об этом методе. Я соответствующим образом обновил свой ответ.

Ответ №2:

Вы должны использовать MenuInflater экземпляр, который передается методу public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) (обратите внимание на 2-й аргумент)
Реальной разницы нет, потому что обычно вы «забудете» его, как только закончите его использовать, но зачем вам создавать его, если у вас уже есть один из аргументов?

Ответ №3:

Изменить с этого :

 MenuInflater inflater = getMenuInflater();
  

Для этого:

 MenuInflater inflater = getActivity().getMenuInflater();