2011-10-15 13 views
9

मैं टुकड़ा अंदर लेकिन पढ़ने http://developer.android.com/resources/articles/avoiding-memory-leaks.html जिसमें कहा करने के लिए यह संदर्भ गतिविधि की तुलना में संदर्भ के आवेदन का उपयोग करने के लिए बेहतर है, मैं getActivity() का उपयोग करने के डर लग रहा है के बाद नया विकल्प मेनू बना रहा हूं। GetMenuInflater()गतिविधि से नया मेनू इन्फ्लूटर या 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); 

} 

और, क्या उन्हें दोनों के बीच मतभेद है? या..वोथ वही हैं?

धन्यवाद।

उत्तर

13

वे बहुत समान हैं। MenuInflator के स्रोत को देखकर, संसाधन फ़ाइलों तक पहुंचने के लिए संदर्भ का उपयोग करने वाली एकमात्र चीज है। तो विशिष्ट संदर्भ मेनू इन्फ्लूटर से कोई फर्क नहीं पड़ता।

मेमोरी लीक का सवाल है, लेख आपको संदर्भ कहते हैं

सबसे स्पष्ट [मेमोरी लीक से बचने के लिए जिस तरह से] अपने स्वयं के दायरे के बाहर संदर्भ से बचने से बचने के लिए है

आप जब तक MenuInflator (या मेनू) को किसी अन्य वर्ग में पास करें, फिर यह गतिविधि में निहित है और लीक नहीं किया जाएगा।

संपादित

अलावा Activity.getMenuInflator() में new MenuInflator() के लिए सिर्फ एक सुविधा विधि है।

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

यह आमतौर पर सुविधा विधियों का उपयोग करने के बाद से वे आप अपने कोड को बदलने के लिए बिना भविष्य के संस्करणों में बदलने के लिए अंतर्निहित कार्यान्वयन के लिए अनुमति देने के लिए बेहतर है: वास्तव में इस गतिविधि वर्ग के भीतर विधि है। उदाहरण के लिए यदि उपर्युक्त विधि प्रत्येक बार एक नया निर्माण करने के बजाय कैश किए गए उदाहरण को वापस करने के लिए संशोधित की जाती है।

+0

हाँ, लेकिन बनाने 'नई' menuInflater लगता है जैसे कि यह "मिल" menuInflater की तुलना में अधिक स्मृति खा जाएगा ... और आपने कहा कि अगर मैं मेन्यू इन्फ्लूटर को किसी अन्य वर्ग में पास नहीं करता हूं तो इसे लीक नहीं किया जाएगा, मैं इसे टुकड़ा वर्ग के अंदर खंडित गतिविधि नहीं कहता हूं, इसलिए यदि मैं कॉल करता हूं तो मेन्यूइन्फ्लेटर इसे "किसी अन्य वर्ग से मेनू इन्फ्लूटर" नहीं कहेंगे ? –

+0

@ GAO-tsukai मुझे इस विधि के बारे में आपका प्रश्न याद आया। मैंने तदनुसार अपना जवाब अपडेट किया। – spatulamania

+0

धन्यवाद, अब मुझे लगता है कि मुझे वास्तव में एंड्रॉइड स्रोत देखने की ज़रूरत है ... –

1

होते ही आप MenuInflater उदाहरण है कि विधि public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) में भेजा जाता है का उपयोग (2 तर्क नोटिस)
वहाँ कोई वास्तविक अंतर है, क्योंकि आम तौर पर आप इसे "भूल" होगा चाहिए के रूप में आप इसे उपयोग करने के बाद, लेकिन आप क्यों की आवश्यकता होगी यदि आपके पास पहले से ही तर्कों में से एक है तो एक बनाने के लिए? इस से

0

बदलें:

MenuInflater inflater = getMenuInflater(); 
इस के लिए

:

MenuInflater inflater = getActivity().getMenuInflater(); 
संबंधित मुद्दे