2013-01-15 73 views
97

我在我的应用程序中有关于StrictMode的问题,并添加了基本禁用StrictModeHelper的代码片段。然而,现在皮棉抱怨setThreadPolicy()并提出以添加有什么更好的:@SuppressLint或@TargetApi?

@SuppressLint 'NewApi' 

@TargetApi(Build.VERSION_CODES.GINGERBREAD) 

onCreate()事件的看法。

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

回答

174

我有问题,我就StrictMode的应用程序,并添加代码片段,基本上禁止StrictModeHelper

请修正网络错误。

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

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

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

例如,假设您没有阻止关于您的网络问题的StrictMode投诉,而是尝试解决在较新版本的Android上序列化为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,林特不会抱怨。在这种情况下,这是有效的。但是,如果我修改此方法以引用在API级别14之前未添加的内容,则将再次出现Lint错误,因为我的@TargetApi(11)注释表示我只修复了API级别11和 以下的代码,并且在 以下以上,而不是以上的以下的API级别14和

使用@SuppressLint('NewApi'),无论我的代码引用以及我的代码是如何处理的,我都将失去Lint错误的任何 API级别。

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

+0

我知道,使用异步方法将是可取的,只是在我的特殊情况下,我会坚持解决方法。感谢这个详细而且非常容易理解的解释 - 在这个机会中,还要感谢你非常有用的网页,这帮助我理解了Android编程的一些概念! R. – richey

+8

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

+2

哇,你的代码示例是我试图编写的EXACT代码!真是巧合:) –

相关问题