क्या बेहतर है: @SuppressLint या @TargetApi?


100

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

@SuppressLint 'NewApi'

या

@TargetApi(Build.VERSION_CODES.GINGERBREAD)

onCreate()दृश्य की घटना के लिए।

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

जवाबों:


176

मेरे पास स्ट्रिक्टमोड के बारे में मेरे ऐप में मुद्दे हैं और कोड स्निपेट जोड़ा गया है जो मूल रूप से स्ट्रिक्टमोड हेल्पर को निष्क्रिय करता है

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

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

@TargetApiऔर @SuppressLintएक ही मूल प्रभाव है: वे लिंट त्रुटि को दबा देते हैं।

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

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

  @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 तक, लिंट शिकायत नहीं करेगा। इस मामले में, वह काम करता है। अगर, हालांकि, मैंने इस विधि को संशोधित किया है जो एपीआई स्तर 14 तक जोड़ा नहीं गया था, तो लिंट त्रुटि फिर से दिखाई देगी, क्योंकि मेरा @TargetApi(11)एनोटेशन कहता है कि मैंने केवल एपीआई स्तर 11 पर काम करने के लिए कोड तय किया है और ऊपर, नीचे नहीं। एपीआई स्तर 14 और ऊपर से नीचे

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

इसलिए, @TargetApiपसंदीदा एनोटेशन है, क्योंकि यह आपको बिल्ड टूल्स को "ठीक है, मैंने समस्याओं की इस श्रेणी को" ठीक-ठाक ढंग से बताया है।


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

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

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

4
यदि आप स्टेटमेंट में बिल्ड.VERSION_CODES.HONEYCOMB का उपयोग करते हैं तो क्या यह @TargetApi (Build.VERSION_CODES.HONEYCOMB) का उपयोग करने के लिए अधिक अनुकूल नहीं होगा?
ओलिवर पियरमैन

1
"यह कि मैंने केवल एपीआई स्तर 11 और नीचे काम करने के लिए कोड तय किया है, एपीआई स्तर 14 और नीचे नहीं।" - क्या आपका मतलब "और ऊपर" नहीं है?
इस्कॉलेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.