哪个更好:@SuppressLint或@TargetApi?


100

我的应用程序中存在有关问题,StrictMode并添加了基本上禁用的代码段StrictModeHelper。但是,Lint setThreadPolicy()现在对此有所抱怨,并建议添加

@SuppressLint 'NewApi'

要么

@TargetApi(Build.VERSION_CODES.GINGERBREAD)

onCreate()视图的事件。

首选哪种方法..或者他们基本上是一样的吗?

Answers:


176

我的应用程序中存在有关StrictMode的问题,并添加了基本上禁用StrictModeHelper的代码段

请修复网络错误。

首选哪种方法..或者他们基本上是一样的吗?

@TargetApi@SuppressLint具有相同的核心效果:它们抑制Lint错误。

不同之处在于,通过@TargetApi,您可以通过参数声明代码中已解决的API级别,因此,如果您以后修改该方法以尝试引用比参考的API级别新的方法,则错误会再次弹出@TargetApi

例如,假定StrictMode您不是在阻止抱怨网络错误的方法,而是在解决AsyncTask在较新版本的Android上序列化的问题。您的代码中具有如下方法,可以选择在较新的设备上加入线程池,并在较旧的设备上使用默认的多线程行为:

  @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)意思是,如果Lint检测到我正在使用比我的产品还新的东西android:minSdkVersion,但是达到API级别11,Lint不会抱怨。在这种情况下,这可行。但是,如果我修改了此方法以引用在API级别14之前未添加的内容,则将再次出现Lint错误,因为我的@TargetApi(11)注释说,我只修复了可在API级别11及以下级别使用的代码,而不是API级别14及以下

使用@SuppressLint('NewApi'),无论我的代码引用和设置要处理的代码如何,对于任何 API级别,我都会丢失Lint错误。

因此,@TargetApi它是首选的注释,因为它允许您以更细粒度的方式告诉构建工具“好,我已修复此类问题”。


我知道使用异步方法会更可取,只是在我的特殊情况下,我会坚持解决方法。感谢您提供的详细且易于理解的解释-借此机会,也感谢您提供的非常有用的网页,这些网页对我帮助很多人理解了Android编程的概念!R.
richey

9
@richey:“只是在我的特定情况下,我会坚持解决方法” –这不是一个好主意。移动设备是移动的。网络连接相当不稳定,在各种情况下(例如,信号较弱)可能会花费大量时间。在主应用程序线程上执行网络I / O意味着您的应用程序将在现场随ANR随机崩溃。
CommonsWare 2013年

2
哇,您的代码示例就是我要编写的EXACT代码!真是巧合:)
伊利亚·科根

4
如果在if语句中使用Build.VERSION_CODES.HONEYCOMB,使用@TargetApi(Build.VERSION_CODES.HONEYCOMB)会更整洁/更一致吗?
奥利弗·皮尔曼

1
“我仅将代码固定为可在API级别11及以下使用,而不能在API级别14及以下使用。” -您的意思不是“以上”吗?
arekolek
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.