9

フラグメント内に新しいオプションメニューを作成していますが、 http://developer.android.com/resources/articles/avoiding-memory-leaks.htmlを読んだ後 、context-activityよりもcontext-applicationを使用する方が良いと言っています。 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);

}

そして、それらの2つの違いは何ですか?または..両方とも同じですか?

ありがとう。

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 に答える