2013-01-15 30 views
97

मुझे StrictMode के संबंध में मेरे ऐप में समस्याएं हैं और कोड स्निपेट जोड़ा गया है जो मूल रूप से StrictModeHelper अक्षम करता है। हालांकि, एक प्रकार का वृक्ष अब setThreadPolicy() के बारे में शिकायत है और या तो जोड़ने के लिएबेहतर क्या है: @SuppressLint या @TargetApi?

@SuppressLint 'NewApi' 

या

@TargetApi(Build.VERSION_CODES.GINGERBREAD) 

देखने के onCreate() घटना का प्रस्ताव।

कौन सी विधि पसंद की गई है .. या वे मूल रूप से वही कर रहे हैं?

उत्तर

174

मैं StrictMode के बारे में मेरे एप्लिकेशन में समस्याएं हैं, और कोड स्निपेट कि मूल रूप से अक्षम कर देता है StrictModeHelper

कृपया नेटवर्किंग बग को ठीक गयी।

कौन सी विधि पसंद की गई है .. या वे मूल रूप से वही कर रहे हैं?

@TargetApi और @SuppressLint ही कोर प्रभाव है: वे एक प्रकार का वृक्ष त्रुटि को दबाने।

अंतर यह है कि @TargetApi साथ, आप घोषणा पैरामीटर के माध्यम से, है, क्या एपीआई स्तर पर आप अपने कोड में संबोधित किया है ताकि फिर से त्रुटि पॉप अप आप बाद में विधि को संशोधित करता है, तो कुछ नए संदर्भित एपीआई से कोशिश करने के लिए कर सकते हैं स्तर @TargetApi में उद्धृत किया गया।

उदाहरण के लिए, मान लीजिए कि StrictMode को अपने नेटवर्किंग बग के बारे में शिकायतों को अवरुद्ध करने के बजाय, आप AsyncTask के एंड्रॉइड के नए संस्करणों पर क्रमबद्ध होने के मुद्दे पर काम करने की कोशिश कर रहे थे। आप नए उपकरणों पर थ्रेड पूल करने के लिए ऑप्ट और पुराने उपकरणों पर डिफ़ॉल्ट multithread व्यवहार का उपयोग करने के अपने कोड में इस तरह की एक विधि है:

@TargetApi(11) 
    static public <T> void executeAsyncTask(AsyncTask<T, ?, ?> task, 
              T... params) { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
     task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params); 
    } 
    else { 
     task.execute(params); 
    } 
    } 

@TargetApi(11) होने का मतलब है कि अगर एक प्रकार का वृक्ष का पता लगाता है कि मैं से नए कुछ का उपयोग कर रहा है मेरी android:minSdkVersion, लेकिन एपीआई स्तर 11 तक, लिंट शिकायत नहीं करेगा। इस मामले में, यह काम करता है। यदि, हालांकि, मैंने इस विधि को कुछ ऐसा संदर्भित करने के लिए संशोधित किया जो API स्तर 14 तक नहीं जोड़ा गया था, तो लिंट त्रुटि फिर से दिखाई देगी, क्योंकि मेरी @TargetApi(11) एनोटेशन का कहना है कि मैंने केवल से नीचे API स्तर 11 और पर काम करने के लिए कोड तय किया है ऊपर, से नीचे एपीआई स्तर 14 और नहीं।

@SuppressLint('NewApi') का उपयोग करना, मैं एक प्रकार का वृक्ष त्रुटि के लिए किसी भी एपीआई स्तर क्या मेरी कोड संदर्भ और क्या मेरी कोड को संभालने के लिए सेट किया गया है की परवाह किए बिना खो देते हैं, करेंगे।

इसलिए, @TargetApi, पसंदीदा एनोटेशन है, क्योंकि यह आप का निर्माण उपकरण बताने के लिए अनुमति देता है एक अधिक परिष्कृत फैशन में "ठीक है, मैं समस्याओं की इस श्रेणी तय"।

+0

मुझे पता है कि एक Async दृष्टिकोण का उपयोग करना बेहतर होगा, बस मेरे विशेष मामले में मैं कामकाज के साथ रहूंगा। इस विस्तृत और बहुत समझने योग्य स्पष्टीकरण के लिए धन्यवाद - और इस मौके पर, आपके बहुत ही उपयोगी वेब पेजों के लिए धन्यवाद, जिसने मुझे एंड्रॉइड प्रोग्रामिंग की कुछ अवधारणाओं को समझने में बहुत मदद की! आर – richey

+8

@richey: "बस मेरे विशेष मामले में मैं कामकाज के साथ रहूंगा" - यह एक अच्छा विचार नहीं है। मोबाइल डिवाइस मोबाइल हैं। नेटवर्क कनेक्शन बल्कि अस्थिर हैं और विभिन्न परिस्थितियों में काफी अधिक समय ले सकते हैं (उदाहरण के लिए, कमजोर सिग्नल)। मुख्य अनुप्रयोग धागे पर नेटवर्क I/O निष्पादित करने का अर्थ है कि आपका ऐप फ़ील्ड में एएनआर के साथ यादृच्छिक रूप से क्रैश हो जाएगा। – CommonsWare

+2

वाह, आपका कोड उदाहरण सटीक कोड है जिसे मैं लिखने की कोशिश कर रहा हूं! क्या संयोग है :) –

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

  • कोई संबंधित समस्या नहीं^_^