更好的是:@SuppressLint还是@TargetApi?

时间:2013-01-15 15:29:58

标签: android eclipse lint

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

@SuppressLint 'NewApi'

@TargetApi(Build.VERSION_CODES.GINGERBREAD)

到视图的onCreate()事件。

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

1 个答案:

答案 0 :(得分:176)

  

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

请修复网络错误。

  

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

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

@TargetApi的区别在于,您通过参数声明了代码中已处理的API级别,以便稍后修改方法以尝试引用更新的内容时,错误会再次弹出比@TargetApi中引用的API级别。

例如,假设您尝试解决在较新版本的Android上序列化的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)意味着如果Lint检测到我使用的是比我android:minSdkVersion更新的内容,但是最高级别为API等级11,则Lint不会抱怨。在这种情况下,这是有效的。但是,如果我修改此方法以引用在API级别14之前未添加的内容,那么Lint错误将再次出现,因为我的@TargetApi(11)注释表明我只修复了代码以使用API​​级别11以及上面的 ,而不是上面的API Level 14和

使用@SuppressLint('NewApi'),我会丢失任何 API级别的Lint错误,无论我的代码引用了什么以及我的代码设置为要处理的内容。

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