2011-10-15 20 views
9

I fragmanını içine ancak bağlam aktiviteden daha bağlam uygulamayı kullanmak daha iyidir, ben getActivity() kullanmak korkuyorum dedi http://developer.android.com/resources/articles/avoiding-memory-leaks.html okuduktan sonra yeni seçenek menüsünü yaratıyorum.()etkinlikten yeni menuInflater veya getMenuInflater() oluşturulsun mu?

Yani getMenuInflater aslında hangi iyi bir

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    MenuInflater mInflater = new MenuInflater(getActivity().getApplicationContext()); 
    mInflater.inflate(R.menu.simple_menu, menu); 
} 

Veya bir çağrı etkinliği

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    MenuInflater mInflater = getActivity().getMenuInflater(); 
    mInflater.inflate(R.menu.simple_menu, menu); 

} 

ve 'em ikisi arasındaki farkları neler? ya da ... sadece aynı mı?

Teşekkürler.

cevap

13

Çok benzerler. MenuInflator kaynağına bakarak, içeriği kullandığı tek şey kaynak dosyalarına erişmek. Yani belirli bir bağlam MenuInflator için önemli değil. Bellek sızıntıları gelince

, başvurabileceğiniz makale

en belirgin [bellek sızıntıları önlemek için bir yol] kendi kapsamı dışında bağlamını kaçan kaçınmaktır diyor

Sürece MenuInflator'ı (veya Menüyü) başka bir sınıfa geçirdikten sonra etkinlik içinde yer alır ve sızdırılmayacaktır. Ayrıca Activity.getMenuInflator() olarak

DÜZENLEME

new MenuInflator() için sadece bir kolaylık yöntemidir.

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

Onlar kodunuzu değiştirmek zorunda kalmadan gelecekteki sürümlerinde değişiklik yatan uygulanması için izin beri kolaylık yöntemleri kullanmak genellikle daha iyidir: Aslında bu Etkinlik sınıfının içindeki bir yöntemdir. Örneğin, yukarıdaki yöntem her seferinde yeni bir tane oluşturmak yerine önbelleğe alınmış bir örneği döndürecek şekilde değiştirilmişse.

Kullanmaya bitirmek, ama neden gerekir biter bitmez normalde bunu "unutmak" olacaktır, çünkü hiçbir gerçek bir fark yoktur
var (2 argüman fark) yöntemine public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) geçirilir MenuInflater örneğini kullanmalıdır
+0

evet, ama yaratma "yeni" menuInflater ... sesler ve menuInflator'ı başka bir sınıfa geçmezsem, sızdırılmayacağını söylemiştim, ben bunu parça sınıfının parçası olarak değil, parçacığı faaliyeti olarak adlandırıyorum, bu yüzden eğer getMenuInflator diye adlandırırsam, "başka bir sınıftaki menuInflator'ı çağırmaz" ? –

+0

@ GAO-tsukai Bu yöntemle ilgili sorunuzu kaçırdım. Cevabımı buna göre güncelledim. – spatulamania

+0

teşekkürler, şimdi gerçekten android kaynağını görmem gerektiğini hissediyorum ... –

1

Argümanlardan zaten bir tane varsa, bir tane oluşturmak için? Bundan

0

Değişikliği: Buna

MenuInflater inflater = getMenuInflater(); 

: Bu menuInflater "get" den fazla bellek yiyeceğiz gibi

MenuInflater inflater = getActivity().getMenuInflater(); 
İlgili konular