閱讀601 返回首頁    go 技術社區[雲棲]


Android 經典筆記六:Annotation注釋使用介紹

Annotation注釋使用介紹
目錄介紹

  • 1.Annotation庫的簡單介紹
  • 2.@Nullable和@NonNull
  • 3.資源類型注釋
  • 4.類型定義注釋
  • 5.線程注釋
  • 6.RGB顏色紙注釋
  • 7.值範圍注釋
  • 8.權限注釋
  • 9.重寫函數注釋
  • 10.返回值注釋
  • 11.@Keep注釋
  • 12.@SuppressWarnings注解
  • 13.其他
  • 14.後續

1.Annotation庫的簡單介紹

  • 包含一係列有用元注釋,幫助開發者在編譯期間發現可能存在的bug 是屬於Support Lib其中之一,獨立jar包
  • 通過注釋來完善自身代碼質量
  • 官方文檔: AndroidAnnotations是一個能讓你進行快速開發的開源框架,它讓你關注真正重要的地方,它可以簡化你的代碼,並且有利於你後期的維護
  • 庫的特點 依賴注入(Dependency injection):支持view, extras, system service, resource等等 簡單的線程模型(Simplified threading model):進行方法注解以讓該方法在UI線程或後台線程進行執行 事件綁定(Event binding):進行方法注解以讓方法執行view的時間而不用再添加一些監聽 REST client:創建一個接口,AndroidAnnotations用來實現 沒有神秘感(No magic):AndroidAnnotations在編譯時會產生一個子類,你可以查看子類中的代碼來知道它是如何工作的. 編譯檢測:提供的多種注解,用於檢測代碼編譯時可能存在的異常,並給開發者相關提示,提高代碼質量 AndroidAnnotations來實現這些美好的功能,隻需要不到150kb的大小 相關文檔給出說明:androidannotations.org 這篇文檔給出了案例,很好地說明了注釋前後代碼的區別

2.@Nullable 和 @NonNull

  • 說明: 檢測參數或者方法返回值是否可以為null,這是該框架中最常用也是最基礎的注解之一了,使用了這兩個注解,在Android Studio中,如果出現代碼不安全的情況下,會給出智能提示 @Nullable作用於函數參數或者返回值,標記參數或者返回值可以為空 @NonNull作用於函數參數或者返回值,標記參數或者返回值不可以為空 @NonNull使用舉例【**千萬別忽視黃色警告-----這個淡黃色警告實際開發中很容易忽視**】
  • 未加注釋: Image.png
  • 添加注釋: Image.png
  • 結論:可以看到加上的@NonNull注解後,Android Studio會自動檢測不安全的代碼並給出友好提示,提示開發者進行修改

  • @Nullable 使用舉例
    Image.png

  • 結論:將@Nullable作用在方法上,這樣方法的返回值是允許為null的,但是可能會導致某些情況下的crash;

3.資源類型注釋

  • 在我們平時開發中我們肯定會經常用到引用一些資源,比如圖片資源及字符串資源或者顏色值資源,因為這些資源的類型都是int值,所以有時候我們在給TextView設置字符串資源時也有可能引用了圖片資源ID,就會導致有問題,比如會出現以下異常:
    android.content.res.Resources$NotFoundException: String resource ID #0x3039

  • 資源通常是以整型值表示的,保存在R.Java文章中。如果傳入資源值不對,那麼編譯器不會報錯,但是運行期會報錯。而注解可以避免這個問題。
    資源類型注解主要都有哪些?

    @StringRes : 表示參數、變量或者函數返回值應該是一個字符串類型的資源
    @ColorInt : 表示參數、變量或者函數返回值應該是一個顏色值而不是顏色資源引用,例如應該是一個 AARRGGBB 的整數值。
    @ColorRes : 表示參數、變量或者函數返回值應該是一個 color 類型的資源,而不是顏色值。注意和 ColorInt 區別
    @AnimRes : 表示參數、變量或者函數返回值應該是一個 Anim 類型的資源
    @DrawableRes : 表示參數、變量或者函數返回值應該是一個 drawable 類型的資源
    @DimenRes : 表示參數、變量或者函數返回值應該是一個 dimension 類型的資源
    
  • 舉例子: 這裏定義了一個方法,方法中隻接受@StringRes注解的int引用
    沒有添加注釋前
    Image.png
    添加注釋後
    Image.png
    結論:添加注釋可以在編譯器就找到錯誤

5.線程注釋

  • 線程注解主要是用於檢測一個函數是否在指定類型的線程中執行
  • 類型 @UiThread:標記運行在UI線程,一個UI線程是Activity運行所在的主窗口,對於一個應用而言,可能存在多個UI線程。每個UI線程對應不同的主窗口。 @MainThread:標記運行在主線程,一個應用隻有一個主線程,主線程也是@UiThread線程。通常情況下,我們使用@MainThread來注解生命周期相關函數,使用@UiThread來注解視圖相關函數,一般情況下@MianThread和@UiThraed是可以互換的。 @WorkerThread:標記運行在後台運行線程。 @BinderThread:標記運行在Binder線程
  • 舉例子 public void threadtest(){ new Thread(new TimerTask() { @Override public void run() { setTest(); } }).start(); } @UiThread public void setTest(){ test.setText("測試"); } 那麼上麵會報錯。提示:不做線程切換,隻起到提示作用!

6.RGB顏色紙注釋

  • 在資源類型注解中我們使用@ColorRes來標記參數類型需要傳入顏色類型的id,而使用@ColorInt注解是標記參數類型需要傳入RGB或者ARGB顏色值的整型值。
  • 舉例子,閱讀TextView源代碼中的setTextColor方法

Image.png

7.值範圍注釋

  • 當函數參數的取值在一定範圍時,可以使用注解來防止調用者傳入錯誤的參數,主要注解有三種。
  • @Size @Size:對於類似數組、集合和字符串之類的參數,我們可以使用@Size注解來表示這些參數的大小。 用法: @Size(min=1)//可以表示集合不可以為空 @Size(max=23)//可以表示字符串最大字符個數為23 @Size(2)//表示數組元素個數為2個 @Size(multiple=2)//可以表示數組大小是2的倍數
  • @IntRange:參數類型是int或者long,用法如下

    public void setInt(@intRange(from=0,to=255)){...}

  • @FloatRange:參數類型是float或者double,用法如下

    public void setFloat(@FloatRange(from=0.0,to=1.0)){...}

  • 舉個例子

  • @FloatRange 用法

Image.png

  • @Size用法

Image.png

  • 數組隻能有2個元素: @Size(2)

Image.png

8.權限注釋

  • Android應用在使用某些係統功能時,需要在AndroidManifest,xml中聲明權限,否則在運行時就會提示缺失對應的權限,為了在編譯時及時發現權限的缺失,我們可以使用@RequiresPermission注解。
  • 如果需要一個權限則加注解。 @RequiresPermission(Manifest.permission.SET_WALLPAPER)
  • 如果需要一個集合至少一個權限,那麼就加注解。 @RequiresPermission(anyOf = {Manifest.permission.SET_WALLPAPER,Manifest.permission.CAMERA})
  • 如果同時需要多個權限,那麼就加注解。 @RequiresPermission(allOf = {Manifest.permission.SET_WALLPAPER,Manifest.permission.CAMERA})
  • 對於Intent調用所需權限的ACTION字符串定義處添加注解。 @RequiresPermission(android.Manifest.permission.BLUETOOTH) String ACTION_REQUEST_DISCOVERRAVLE = "android.bluetooth.adapter.REQUEST_DISCOVERRAVLE";
  • 對於ContentProvider所需權限,可能有讀和寫兩個操作。對應不同的權限。 @RequiresPermission.Read(@RequestPermission(READ_HISTORY_BOOLMARKS)) @RequiresPermission.Write(@RequestPermission(WRITE_HISTORY_BOOLMARKS)) public static final Uri BOOKMARKS_URI = Uri.parse("content://browser/bookmarks); 9.重寫函數注釋
  • 如果API允許重寫某個函數,但是要求在重寫該函數時需要調用super父類的函數。 可以加注解@CallSuper來提示開發者。若是重寫不調用super就會報錯 舉例子

Image.png

10.返回值注釋

  • 該注解是為了檢測方法返回值是否是需要使用的,如果沒有被使用,則AndroidStudio會給出警告提示
    @CheckResult使用案例

  • 添加注釋:

Image.png

11.@Keep注釋

  • @keep是用來標記在Proguard混淆過程中不需要混淆的類或者方法。在混淆時一些不需要混淆的會使用
    -keep class com.foo.bar{public static }

  • 有了@Keep之後,就可以在編碼時標注出一些不需要混淆的類或者方法

12.@SuppressWarnings注解

  • 這個注解在源碼裏是隨處可見,其實它的用法很簡單,就是對一些警告信息的過濾。 源代碼

Image.png

  • 這個注解是可以使用在屬性、方法、構造方法、變量等等。那麼它的參數就是一個字符串數組。可以單個,可以多個。
    示例

    @SuppressWarnings("unchecked")
    告訴編譯器忽略 unchecked 警告信息,如使用List,ArrayList等未進行參數化產生的警告信息。
    @SuppressWarnings("serial")
    如果編譯器出現這樣的警告信息:The serializable class WmailCalendar does not declare a static final serialVersionUID field of type long使用這個注釋將警告信息去掉。
    @SuppressWarnings("deprecation")
    如果使用了使用@Deprecated注釋的方法,編譯器將出現警告信息。使用這個注釋將警告信息去掉。
    @SuppressWarnings("unchecked", "deprecation")
    告訴編譯器同時忽略unchecked和deprecation的警告信息。
    @SuppressWarnings(value={"unchecked", "deprecation"})
    等同於@SuppressWarnings("unchecked", "deprecation")
    

    13.其他

    @EActivity、@ViewById、@Click
    這三個注解應該是對我們的代碼簡潔性最有幫助的
    @EActivity : 後麵需要跟上一個layout id,來標示該Activity所加載的xml布局,這樣原來的onCreate()方法就不用寫了;
    @ViewById : 與findViewById作用一致,而且@ViewById後麵可以不寫控件id,前提是控件變量名要與控件id一致
    @Click : 也就是控件的點擊事件,而且如果控件ID與方法名一致,後麵就不用寫控件ID了. 該注解可以單獨寫,也可以對多個Button合並寫
    

    代碼案例

    //這裏加注解就可以不寫onCreate方法 
    @EActivity(R.layout.activity_test_annotation) 
    public class TestAnnotation extends AppCompatActivity { 
    
    @ViewById(R.id.tv_name)//如果變量名和控件ID一致,後麵就不用寫id 
    TextView tv_name; 
    
    @Click(R.id.showName)//如果控件ID與方法名一致,後麵就不用寫id 
    public void showName(){ 
        Toast.makeText(this,tv_name.getText(),Toast.LENGTH_SHORT).show(); 
    } 
    }   
    

    14.後續

  • 平時喜歡寫寫文章,筆記。陸續整理文章,敬請期待:

  • 知乎:https://www.zhihu.com/people/yang-chong-69-24/pins/posts

  • 領英:https://www.linkedin.com/in/chong-yang-049216146/

  • 簡書:https://www.jianshu.com/u/b7b2c6ed9284

  • csdn:https://my.csdn.net/m0_37700275

  • 網易博客:https://yangchong211.blog.163.com/

  • 新浪博客:https://blog.sina.com.cn/786041010yc

  • github:https://github.com/yangchong211

  • 喜馬拉雅聽書:https://www.ximalaya.com/zhubo/71989305/

  • 脈脈:yc930211

  • 360圖書館:https://www.360doc.com/myfiles.aspx

  • 開源中國:https://my.oschina.net/zbj1618/blog

  • 泡在網上的日子:https://www.jcodecraeer.com/member/content_list.php?channelid=1

  • 郵箱:yangchong211@163.com

最後更新:2017-09-20 10:02:52

  上一篇:go  Android 經典筆記之五:DownloadManager下載管理器介紹
  下一篇:go  高曉鬆三問阿裏巴巴合夥人,為什麼來 為什麼留 為什麼戰