1. 程式人生 > >Support Annotation Library使用詳解

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…

Annotation Library的使用

如果我們的sdk安裝了Android Support Respository,那麼我們可以開啟工程的Srrucure,選中Module,選中Dependencies選項卡,點選新增按鈕,選中Android Library。然後通過gradle可以很容易的把這些註解新增到我們的工程中。

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

常用註解

Nullness註解

使用@NonNull註解修飾的引數不能為null。在下面的程式碼例子中,我們有一個取值為null的name變數,它被作為引數傳遞給sayHello函式,而該函式要求這個引數是非null的String型別:

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將會以警告的形式提醒我們這個地方有問題。
這裡寫圖片描述

資源型別註解

我們知道在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,例如:

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定義為如下標誌位。

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

    public @interface Flavour {

}

那麼我們可以這麼呼叫。

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

@StringDef用法和@IntDef基本差不多。

許可權註解

在Android中,有很多場景都需要使用許可權,無論是Marshmallow之前還是之後的動態許可權管理.都需要在manifest中進行宣告,如果忘記了,則會導致程式崩潰. 好在有一個註解能輔助我們避免這個問題.使用RequiresPermission註解即可。

@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等,這些都大大提高了我們的開發效率。

相關推薦

Support Annotation Library使用

概述 Support Annotation Library是在Android Support Library19.1版本開始引入的一個全新的函式包,它包含了諸多有用的元註解。用來幫助開發者在編譯期間發現可能存在的bug。Support Library本身也使用

Android進階系列之Support Annotation Library使用

Android Support Library 發展到現在已經不止是一個jar包了,而是拆分成多個獨立的Jar包,例如support-v4、support-v7、gridlayout-v7、design、cardview-v7等等。而Annotation Libary 也是其中之一,預設情況下是不會包含在工

Design Support Library

編輯推薦:稀土掘金,這是一個針對技術開發者的一個應用,你可以在掘金上獲取最新最優質的技術乾貨,不僅僅是Android知識、前端、後端以至於產品和設計都有涉獵,想成為全棧工程師的朋友不要錯過! 導讀:這個相容庫很容易和之前的 Android Support

Java Annotation使用

方法覆蓋 字段 target jvm 類的方法 bsp value 機制 通用 Java Annotation是JDK5.0引入的一種註釋機制。它與註釋有一定區別,可以理解為代碼上的特殊標記,通過這些標記我們可以在編譯,類加載,運行等程序類的生命周期內被讀取、執行相應的處

Android Paging library(二)

重要API及原始碼分析 文章目錄 1.重要API介紹 1.1 DataSource 1.2 PageList 1.3 PagedListAdapter 2.原始碼解析 1.重要API介紹 Pagin

Android Paging library(一)

官方文件翻譯 文章目錄 1.概覽 1.1 庫架構 1.2 支援不同的資料架構 1.2.1 網路獲取或者資料庫 1.2.2 網路和資料庫同時獲取 1.2.3 處理網路錯誤 1.2.4 更新

Android Design Support Library 使用

概述 Android Design Support Library 是Google在2015年的IO大會上,帶來的全新適應Material Design設計規範的支援庫。在這個支援庫中,給我們提供了更加規範的MD設計風格控制元件。重要的是,Android De

Java 基礎之--註解Annotation

註解 java 基礎 time span face 自定義註解 div ace rtu 自定義註解入門: public @interface Annotation01 { //set default value ""; String value() de

CentOS5/6/7系統下搭建安裝Amabari大資料叢集時出現SSLError: Failed to connect. Please check openssl library versions.錯誤的解決辦法(圖文

        不多說,直接上乾貨!         ========================== Creating target directory... ======================

CentOS5/6/7系統下搭建安裝Amabari大數據集群時出現SSLError: Failed to connect. Please check openssl library versions.錯誤的解決辦法(圖文

詳解 warning 個人博客 xxx pin fig scp oca str   不多說,直接上幹貨! ========================== Creating target directory...

SVM(Support Vector Machin) 支援向量機

吳恩達的課程中跟國內的一些教程中分析問題的思路還是有些不同的,吳恩達的課程從簡單的LR開始讓我們先去理解優化目標,一步步的引導我們去理解SVM,然後揭開他神祕的面紗,便於理解,是很不錯的課程。我學習的國內課程是直接重點講解,講到SVM核心內容。在這裡我總結下自己學習SVM的一些想法(目標函式的優化,

SpringMVC配置檔案:<context:annotation-config/>和<context:component-scan base-package=""/>和<mvc:annotation-driven /> Spring配置檔

原文地址:https://www.cnblogs.com/lcngu/p/5080702.html Spring配置檔案詳解:<context:annotation-config/>和<context:component-scan base-package=""/>和<mvc:

Linux動態連結那點事兒(`cmake find_package,linux shared library`路徑

Motivation 經常在Linux下面寫C++程式,尤其是需要整合各種第三方庫的工程,肯定對find_package指令不陌生。 這是條很強大的指令。可以直接幫我們解決整個工程的依賴問題,自動把標頭檔案和動態連結檔案配置好。比如說,在Linux下面工程依賴了OpenCV,只需

context:annotation-config與mvc:annotation-driven和context:component-scan

現在常用框架中SpringMVC.xml配置是: <mvc:annotation-driven/>和<context:component-scan> 那麼<context:annotation-config/>呢? 【1】

Spring學習(1):控制反轉(IoC)和依賴注入(DI)的以及註解(annotation)開發入門案例

前言 以往的java學習中,我們要想得到一個物件,就把它new出來。如:Apple apple = new Apple(); 在一些複雜的系統中,一個物件A可能依賴於物件B,C等(程式碼表現為A類持有B,C類的物件作為A類的屬性)。以往來說,我們想要使用B,

JAVA 與 MyCat(5) 類的載入 Java內省/反射機制 註解Annotation

通過mycat來學習java了^^。 上一篇瞭解了XML解析的四種方式,並對MyCat的原始碼進行了修改,這一篇接著往下看: dtd = XMLRuleLoader.class.getResourceAsStream(dtdFile); x

Android Library的建立及使用

Android Library和Android APP、Java Library的區別 Android Library在目錄結構上與Android App相同,它能包含構建APP所需的一切(如原始碼、資原始檔、Android Manifest)。Android

support中v4 v7庫版本錯誤

support中v4 v7庫版本錯誤,主要會報以下兩種錯誤,下面針對每一種錯誤進行詳解 第一種 錯誤資訊: 先來看兩個崩潰資訊,如下: java.lang.NoClassDefFoundError: Failed resolution of:

Oracle記憶體Library cache 庫緩衝

Oracle記憶體詳解之 Library cache 庫緩衝 2017年11月09日 11:38:39 閱讀數:410更多 個人分類: 體系結構 Library cache是Shared pool的一部分,它幾乎是Oracle記憶體結構中最複雜的一部分,主要存放shared curo

C執行時庫(C Run-time Library

一、什麼是C執行時庫1)C執行時庫就是 C run-time library,是 C 而非 C++ 語言世界的概念:取這個名字就是因為你的 C 程式執行時需要這些庫中的函式.2)C 語言是所謂的“小核心”語言,就其語言本身來說很小(不多的關鍵字,程式流程控制,資料型別等);所以,C 語言核心開發出來之後,De