什么更好:@SuppressLint 还是 @TargetApi?

100
我在我的应用程序中遇到了与StrictMode有关的问题,我已经添加了代码片段来禁用StrictModeHelper。然而,现在Lint关于setThreadPolicy()发出了警告,并建议添加...
@SuppressLint 'NewApi'

或者
@TargetApi(Build.VERSION_CODES.GINGERBREAD)

onCreate()事件添加到视图中。

哪种方法更好...或者它们基本上做的是相同的事情?

1个回答

177

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

请修复网络错误。

哪种方法更好..或者它们基本上做相同的事情?

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

区别在于,使用@TargetApi时,您通过参数声明您在代码中已经解决了哪个API级别,因此如果以后修改了该方法并尝试引用比@TargetApi中引用的API级别更新的内容,则错误可能会再次弹出。

例如,假设您正在尝试解决AsyncTask在较新版本的Android上被序列化的问题,而不是阻止关于网络错误的StrictMode投诉。 您在代码中有一个类似于以下内容的方法,以便在较新设备上选择线程池并在旧设备上使用默认的多线程行为:

  @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
“就我个人而言,我会坚持使用这个解决方法。”-- 这并不是个好主意。移动设备是可移动的。网络连接相当不稳定,在不同情况下可能需要更长时间(例如,信号弱)。在主应用程序线程上执行网络I/O意味着你的应用程序将会在现场随机崩溃并出现ANR问题。 - CommonsWare
2
哇,你的代码示例就是我正在尝试编写的完全相同的代码!真是太巧了 :) - Ilya Kogan
4
如果你在if语句中使用了Build.VERSION_CODES.HONEYCOMB,那么使用@TargetApi(Build.VERSION_CODES.HONEYCOMB)会更加整洁和一致,但不改变原意。 - Oliver Pearmain
1
“我只修复了代码以适用于API 11及以下版本,而不是API 14及以下版本。” - 你的意思不是“及以上”吗? - arekolek
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接