Android中高低API版本兼容使用@TargetApi或者@SuppressLint("NewApi")

例如:AndroidManifest.xml中,我们配置了sdk版本的最低为9,目标sdk为19

    <uses-sdk        android:minSdkVersion="9"        android:targetSdkVersion="19" />

当我们使用了大于sdk版本为9的API时候,编译器就会提示警告。例如:

import android.os.AsyncTask;import android.os.Build;public class Test {    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);          }    }}

警告如下:

Multiple markers at this line- Field requires API level 11 (current min is 9):  android.os.AsyncTask#THREAD_POOL_EXECUTOR- Call requires API level 11 (current min is 9): android.os.AsyncTask#executeOnExecutor


截图如下截图如下:


Multiple markers at this line- Field requires API level 11 (current min is 9):  android.os.AsyncTask#THREAD_POOL_EXECUTOR- Call requires API level 11 (current min is 9): android.os.AsyncTask#executeOnExecutor


解决方法是在方法上加上@SuppressLint("NewApi")或者@TargetApi()。

那他们之间有什么区别呢,很简单,

@SuppressLint("NewApi")屏蔽一切新api中才能使用的方法报的android lint错误

@TargetApi() 只屏蔽某一新api中才能使用的方法报的android lint错误。

Android中高低API版本兼容使用@TargetApi或者@SuppressLint("NewApi")_第1张图片" src="https://img.it610.com/image/info5/1e8415689aa146f58d213eade8e74e62.jpg" width="650" height="266" style="border:1px solid black;">

使用@TargetApi(Build.VERSION_CODES.HONEYCOMB)方式解决

import android.annotation.TargetApi;import android.os.AsyncTask;import android.os.Build;@TargetApi(Build.VERSION_CODES.HONEYCOMB)public class Test {    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);          }    }}


使用@SuppressLint("NewApi")方式解决

import android.annotation.SuppressLint;import android.os.AsyncTask;import android.os.Build;public class Test {@SuppressLint("NewApi")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);          }    }}


当然,不管你使用了哪个注解,作用仅仅是屏蔽android lint错误,所以在方法中还要判断版本做不同的操作,例如上述代码。

public class Test {    @TargetApi(Build.VERSION_CODES.HONEYCOMB)    static public <T> void executeAsyncTask(AsyncTask<T, ?, ?> task,            T... params) {        // 当版本大于Build.VERSION_CODES.HONEYCOMB时调用的方法        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {            task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);        }        // 当版本小于Build.VERSION_CODES.HONEYCOMB时调用的方法        else {            task.execute(params);        }    }}


PS: What is better: @SuppressLint or @TargetApi?

(地址:http://stackoverflow.com/questions/14341042/what-is-better-suppresslint-or-targetapi)

====================================================================================

作者:欧阳鹏 欢迎转载,与人分享是进步的源泉!

转载请保留原文地址:http://blog.csdn.net/ouyang_peng

====================================================================================

更多相关文章

  1. ContentProvider的工作过程
  2. SystemServer(一):恢复出厂设置后wifi、数据流量、gps设置关闭
  3. Android(安卓)ListView列表视图的使用方法
  4. 记录的Android开发过程中遇到的问题。
  5. RecyclerView 局部刷新、删除错乱
  6. Android中EditText控件的几种使用方法
  7. android 桌面组件 App widget的使用
  8. Android中获取字符串长度、宽度(所占像素宽度)
  9. Android非正常结束时的生命周期

随机推荐

  1. SQL Server重温 事务
  2. SQL参数化查询的另一个理由 命中执行计划
  3. SQL临时表递归查询子信息并返回记录的代
  4. 每个分类取最新的几条的SQL实现代码
  5. 关于SQL中CTE(公用表表达式)(Common Table E
  6. SQL中JOIN和UNION区别、用法及示例介绍
  7. SQL的Join使用图解教程
  8. SQL Join的一些总结(实例)
  9. SQL Transcation的一些总结分享
  10. sqlserver 索引的一些总结