#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();