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

ric*_*hey 100 eclipse android lint

我在我的应用程序中遇到问题,StrictMode并添加了基本上禁用该代码片段的代码片段StrictModeHelper.然而,Lint setThreadPolicy()现在抱怨并建议添加

@SuppressLint 'NewApi'
Run Code Online (Sandbox Code Playgroud)

要么

@TargetApi(Build.VERSION_CODES.GINGERBREAD)
Run Code Online (Sandbox Code Playgroud)

对于onCreate()观点的事件.

哪种方法更受欢迎..或者它们基本上是这样做的吗?

Com*_*are 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);
    }
  }
Run Code Online (Sandbox Code Playgroud)

具有@TargetApi(11)意味着如果Lint检测到我使用的是比我更新的东西android:minSdkVersion,但是达到API等级11,Lint就不会抱怨.在这种情况下,这是有效的.但是,如果我修改这个方法来引用未添加至API等级14的东西,那么将再次出现皮棉错误,因为我的@TargetApi(11)注释说,我只固定的代码对API级别11工作,并低于以上,不API级别14和下面的上方.

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

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

  • @richey:"只是在我的特殊情况下,我会坚持解决方法" - 这不是一个好主意.移动设备是移动的.网络连接相当不稳定,并且在各种情况下可能花费更多时间(例如,弱信号).在主应用程序线程上执行网络I/O意味着您的应用程序将在现场使用ANR随机崩溃. (9认同)
  • 考虑到在if语句中使用Build.VERSION_CODES.HONEYCOMB,使用@TargetApi(Build.VERSION_CODES.HONEYCOMB)会不会更整洁/更一致? (4认同)
  • 哇,你的代码示例是我正在尝试写的精确代码!真是巧合:) (2认同)