Support Annotation Library使用詳解

概述

Support Annotation Library是在Android Support Library19.1版本開始引入的一個全新的函數包,它包含了諸多有用的元註解。用來幫助開發者在編譯期間發現可能存在的bug。Support Library自己也使用Annotations Library提供的註解來完善Library的代碼質量。
Android的每個版本都在不斷的完善Annotation Library,在Android Support Library22.2版本中,又新增了13種新的Annotation Library註解。Android Support Library發展到25,已經有多個獨立的jar,如咱們常見的Support-v4,Support-v7…java

Annotation Library的使用

若是咱們的sdk安裝了Android Support Respository,那麼咱們能夠打開工程的Srrucure,選中Module,選中Dependencies選項卡,點擊添加按鈕,選中Android Library。而後經過gradle能夠很容易的把這些註解添加到咱們的工程中。android

compile 'com.android.support:support-annotations:23.1.1'

經常使用註解

Nullness註解

使用@NonNull註解修飾的參數不能爲null。在下面的代碼例子中,咱們有一個取值爲null的name變量,它被做爲參數傳遞給sayHello函數,而該函數要求這個參數是非null的String類型:web

public class MainActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String name = null;
        sayHello(name);
    }

    void sayHello(@NonNull String s) {
        Toast.makeText(this, "Hello " + s, Toast.LENGTH_LONG).show();
    }
}

因爲代碼中參數String s使用@NonNull註解修飾,所以IDE將會以警告的形式提醒咱們這個地方有問題。
這裏寫圖片描述api

資源類型註解

咱們知道在Android中,資源一般以整型表示,並保存在R.java中,這意味着若是資源傳的是String類型,則編譯就會報錯,爲了給開發者以提示,Android有了資源類型註解,在最新的版本中,每種資源都對應一種註解。
這裏寫圖片描述
常見的資源型註解以下:
AnimRes
AnimatorRes
AnyRes
ArrayRes
AttrRes
BoolRes
ColorRes
DimenRes
DrawableRes
FractionRes
IdRes
IntegerRes
InterpolatorRes
LayoutRes
MenuRes
PluralsRes
RawRes
StringRes
StyleRes
StyleableRes
TransitionRes
XmlRes多線程

類型定義註解

在Android開發中,整型不只用來表明資源引用值,還能夠用來表明枚舉,IntDef註解就是用來定義整型的新註解,咱們能夠用來標記咱們本身編寫的api,例如:ide

public class IceCreamFlavourManager {
    private int flavour;
    public static final int VANILLA = 0;
    public static final int CHOCOLATE = 1;
    public static final int STRAWBERRY = 2;
    @IntDef({VANILLA, CHOCOLATE, STRAWBERRY})
    public @interface Flavour {
    }
    @Flavour
    public int getFlavour() {
        return flavour;
    }
    public void setFlavour(@Flavour int flavour) {
        this.flavour = flavour;
    }
}

這時若是咱們使用錯誤的整型值調用IceCreamFlavourManager.setFlavour時,IDE將報錯。
這裏寫圖片描述
固然咱們也能夠指定整型值做爲標誌位,也就是說這些整型值可使用’|’或者’&’進行與或等操做。若是咱們把@Flavour定義爲以下標誌位。svg

@IntDef(flag = true, value = {VANILLA, CHOCOLATE, STRAWBERRY})

    public @interface Flavour {

}

那麼咱們能夠這麼調用。函數

iceCreamFlavourManager.setFlavour(IceCreamFlavourManager.VANILLA & IceCreamFlavourManager
                .CHOCOLATE);

@StringDef用法和@IntDef基本差很少。gradle

權限註解

在Android中,有不少場景都須要使用權限,不管是Marshmallow以前仍是以後的動態權限管理.都須要在manifest中進行聲明,若是忘記了,則會致使程序崩潰. 好在有一個註解能輔助咱們避免這個問題.使用RequiresPermission註解便可。ui

@RequiresPermission(Manifest.permission.SET_WALLPAPER)
  public void changeWallpaper(Bitmap bitmap) throws IOException {
}

Color值限定註解

上面部分提到了ColorRes,用來限定顏色資源id,這裏咱們將使用ColorInt,一個用來限定Color值的註解. 在較早的TextView的setTextColor是這樣實現的。

public void setTextColor(int color) {
  mTextColor = ColorStateList.valueOf(color);
  updateTextColors();
}

線程註解

Android開發中常常會涉及到不少線程,如主線程,子線程等操做。我相信你們在使用什麼EventBus,消息總線…看的比較多,Android中提供了四個與線程相關的註解。

  • @UiThread,一般能夠等同於主線程,標註方法須要在UIThread執行,好比View類就使用這個註解
  • @MainThread 主線程,常常啓動後建立的第一個線程
  • @WorkerThread 工做者線程,通常爲一些後臺的線程,好比AsyncTask裏面的doInBackground就是這樣的.
  • @BinderThread 註解方法必需要在BinderThread線程中執行,通常使用較少.
    例如大名鼎鼎的AsyncTask。
new AsyncTask<Void, Void, Void>() {
    //doInBackground is already annotated with @WorkerThread
    @Override
    protected Void doInBackground(Void... params) {
      return null;
      updateViews();//error
    }
  };
 
@UiThread
public void updateViews() {
  Log.i(LOGTAG, "updateViews ThreadInfo=" + Thread.currentThread());
}

注意,這種狀況下不會出現錯誤提示。

new Thread(){
  @Override
  public void run() {
    super.run();
    updateViews();
  }
}.start();

雖然updateViews會在一個新的工做者線程中執行,可是在compile時沒有錯誤提示。由於它的判斷依據是,若是updateView的線程註解(這裏爲@UiThread)和run(沒有線程註解)不一致纔會錯誤提示.若是run方法沒有線程註解,則不提示。

CallSuper重寫函數註解

重寫的方法必需要調用super方法。使用這個註解,咱們能夠強制方法在重寫時必須調用父類的方法 好比ApplicationonCreate,onConfigurationChanged等。

@Keep註解

在Android編譯生成APK的環節,咱們一般須要設置minifyEnabled爲true實現下面的兩個效果
混淆代碼
刪除沒有用的代碼
可是出於某一些目的,咱們須要不混淆某部分代碼或者不刪除某處代碼,除了配置複雜的Proguard文件以外,咱們還可使用@Keep註解 。

@Keep
public static int getBitmapWidth(Bitmap bitmap) {
  return bitmap.getWidth();
}

返回值註解

咱們開發的時候,有時候須要對返回的值作一些出來,那麼久用到了@CheckResult註解,若是一個方法獲得告終果,卻沒有使用這個結果,就會有錯誤出現,一旦出現這種錯誤,就說明你沒有正確使用該方法。

@CheckResult
public String trim(String s) {
  return s.trim();
}

註解在Android開發中隨處能夠看到,如ButterKnife,afinal,eventbus等,這些都大大提升了咱們的開發效率。

本文同步分享在 博客「xiangzhihong8」(CSDN)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索