2014-06-12 11 views
60

तो मैं स्मृति प्रदर्शन पर एंड्रॉइड लेखों पर इस सर्वोत्तम प्रथाओं में आया हूं।एंड्रॉइड मेमोरी गाइड में "निर्भरता इंजेक्शन फ्रेमवर्क से बचें" क्या डैगर पर भी लागू होता है?

http://developer.android.com/training/articles/memory.html

उन्होंने कहा कि क्योंकि वे कोड तुम लिखो को सरल बनाने और प्रदान कर सकते हैं

बचें निर्भरता इंजेक्शन चौखटे

ऐसे Guice या RoboGuice के रूप में एक निर्भरता इंजेक्शन ढांचे का उपयोग आकर्षक हो सकता है एक अनुकूल वातावरण जो परीक्षण के लिए उपयोगी है और अन्य कॉन्फ़िगरेशन परिवर्तन। हालांकि, ये ढांचे एनोटेशन के लिए अपना कोड स्कैन करके प्रक्रिया प्रारंभिकरण के बहुत सारे निष्पादित करते हैं, जो रैम में मैप किए जाने के लिए आपके कोड की महत्वपूर्ण मात्रा की आवश्यकता हो सकती है, भले ही आपको इसकी आवश्यकता न हो। इन मैप किए गए पृष्ठों को स्वच्छ मेमोरी में आवंटित किया गया है ताकि एंड्रॉइड उन्हें छोड़ सके, लेकिन यह तब तक नहीं होगा जब तक पृष्ठों को लंबे समय तक स्मृति में छोड़ा नहीं गया है।

लेकिन Dagger के बारे में क्या वे तेजी से दावा करते हैं। यकीन नहीं है कि मुझे किसके लिए जाना चाहिए?

+27

क्यों इस सवाल -6 वोट है और के रूप में मुख्य रूप से राय-आधारित चिह्नित है ?? लेखक सरल पूछ रहा है कि क्या डैगर फ्रेमवर्क एंड्रॉइड डेवलपर गाइड द्वारा प्रदान किए गए पाठ में संदर्भ में संदर्भित करता है, जो एक सुस्पष्ट प्रश्न है (राय-आधारित नहीं) –

उत्तर

37

यह सिफारिश सभी निर्भरता इंजेक्शन ढांचे के लिए समान रूप से लागू होती है।

..frameworks [Guice की तरह है कि काम] एनोटेशन, जो अपने कोड के महत्वपूर्ण मात्रा की आवश्यकता होती है सकते हैं के लिए अपने कोड को स्कैन द्वारा प्रक्रिया प्रारंभ का एक बहुत प्रदर्शन करते हैं रैम भी आप यद्यपि में मैप किया , इस प्रकार यह की जरूरत नहीं है ..

एक डि/आईओसी रूपरेखा है कि कहा [रन-टाइम] एनोटेशन के लिए स्कैन नहीं करता है का उपयोग कर, प्रतिबिंब के [अत्यधिक] उपयोग जिसका अर्थ है, तो इस कारण से लागू नहीं होता है जबकि Dagger एनोटेशन का उपयोग करता है, ये used differently हैं जो गुइस से हैं और बताई गई समस्या से बचें।

के बाद से डैगर के रूप में "एक तेजी निर्भरता इंजेक्टर एंड्रॉयड और जावा के लिए ", लेखकों इस उद्देश्य के लिए यह बनाया गया है और विश्वास है कि यह इस तरह के एक लक्ष्य के लिए उपयुक्त है है लिखा गया था - आगे बढ़ो, इसे आजमाइए ।


डैगर का उपयोग करता है संकलन-समय एनोटेशन (अच्छी तरह से, mostly) रन-टाइम एनोटेशन और प्रतिबिंब पर निर्भर रहने के बजाय; यह रन-टाइम एनोटेशन स्कैनिंग और प्रतिबिंब है जो इस मुद्दे को स्मृति मार्गदर्शिका के बारे में चेतावनी दे रहा है।

+4

मैंने एंड्रॉइड दस्तावेज़ों के लिए एक मुद्दा बनाया है] (https://code.google.com/p/android/issues/detail?id=213009&thanks=213009&ts=1465906273)। कृपया इस मुद्दे के लिए वोट दें। – TmTron

+1

टूथपिक डैगर के लिए भी एक अच्छा विकल्प है, उसी प्रदर्शन और मेमोरी पैर प्रिंट के साथ: https://github.com/stephanenicolas/toothpick – Snicolas

0

डैगर, @JakeWharton के निर्माता, यह भी एक सरल दृश्य "इंजेक्शन" ढांचे Butterknife

because all the RoboGuice converts were complaining about lack of "view injection" with Dagger बुलाया लिखा था।

आप इस तरह इसका इस्तेमाल:

class ExampleActivity extends Activity { 
    @InjectView(R.id.title) TextView title; 
    @InjectView(R.id.subtitle) TextView subtitle; 
    @InjectView(R.id.footer) TextView footer; 

    @Override public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.simple_activity); 
    ButterKnife.inject(this); 
    // TODO Use "injected" views... 
    } 
} 
12

एंड्रॉयड टीम ने हाल ही suggest developers use Dagger 2 करने के लिए उनकी सिफारिश को अपडेट किया गया।

पिछली सिफारिश प्रतिबिंब की उच्च लागत पर आधारित थी। चूंकि डैगर 2 अब प्रतिबिंब का उपयोग नहीं करता है - डैगर 1 ने किया - उनका मानना ​​है कि यह "बिना किसी रनटाइम लागत या मेमोरी उपयोग के एंड्रॉइड ऐप्स में उपयोग किया जा सकता है"

(अस्वीकरण:। मैं डैगर 2 टीम के मैनेजर हूँ)

+0

प्रश्न के लिए यह अच्छा जवाब है –

संबंधित मुद्दे