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

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

}

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

Спасибо.


person Ridwan Yusuf    schedule 15.10.2011    source источник


Ответы (3)


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

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

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

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

ИЗМЕНИТЬ

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

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

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

person spatulamania    schedule 15.10.2011
comment
да, но создание нового menuInflater звучит так, как будто оно будет потреблять больше памяти, чем получение menuInflater... и вы сказали, что оно не будет просочено, если я не передам menuInflator другому классу, я называю это внутри класса фрагмента, а не фрагмента активности, поэтому, если я вызову getMenuInflator, не будет ли он вызывать menuInflator из другого класса? - person Ridwan Yusuf; 15.10.2011
comment
@ GAO-tsukai Я пропустил ваш вопрос об этом методе. Я обновил свой ответ соответственно. - person spatulamania; 15.10.2011

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

person Display Name    schedule 28.02.2014

Измените это:

MenuInflater inflater = getMenuInflater();

К этому:

MenuInflater inflater = getActivity().getMenuInflater();
person Kapil Bansal    schedule 25.03.2017