ButterKnife初探

前言

  最近證號有時間就寫了些東西,發現ButterKnife挺好用的,和你們分享一下,今後告別findViewById。html

ButterKnife 概要

簡介

  ButterKnife(黃油刀) 是一個 Android 系統的 View 注入框架,可以經過『註解』的方式來綁定 View 的屬性或方法。android

好比使用它可以減小 findViewById() 的書寫,使代碼更爲簡潔明瞭,同時不消耗額外的性能。git

固然這樣也有個缺點,就是可讀性會差一些,好在 ButterKnife 比較簡單,學習難度也不大。github

使用

這裏以 as Gradle 爲例,爲項目添加 ButterKnife,注意兩個步驟都要完成:app

一、Project 的 build.gradle 添加:

dependencies {
  classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}

2. App 的 build.gradle 添加:框架

apply plugin: 'com.neenbedankt.android-apt'

dependencies {
  compile 'com.jakewharton:butterknife:8.0.1'
  apt 'com.jakewharton:butterknife-compiler:8.0.1'
}

從新編譯一下工具

對了還可使用as插件自動生成控件注入(Android Butterknife Zelezny)用法請參考Android Butterknife Zelezny性能

關於Butterknife註解用法請移步到官網Butterknife學習

原理簡單分析

Java Annotation Processing

註解處理器,在 Java5 中叫 APT,有沒有很眼熟:gradle

dependencies {
  classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}

// 引入 ButterKnifeProcessor 等 
apt 'com.jakewharton:butterknife-compiler:8.0.1'

這是一個用於編譯時掃描和解析 Java 註解的工具,經過它咱們能夠本身定義註解,並定義解析器來處理它們。它的原理是讀入 Java 源代碼,解析註解,而後生成新的 Java 代碼,新生成的代碼最後被編譯成 Java 字節碼。

固然這裏咱們不是要深究 APT 的原理,而是要知道在 ButterKnife 中運用到了這個工具。

ButterKnife 流程

這裏以一個栗子來一步步觀察,ButterKnife 的工做流程。

在此以前看一眼 @BindView 註解的定義:

@Retention(CLASS) @Target(FIELD)
public @interface BindView {
  /** View ID to which the field will be bound. */
  @IdRes int value();
}

重點在於 @Retention(CLASS),它表示該註解在編譯時被保留,但在運行時 JVM 會忽略它。所以使用 ButterKnife 的註解,不會對運行時的性能形成消耗。

掃描 ButterKnife 註解

首先咱們使用註解來聲明咱們的一個 View:

@BindView(R.id.text1) TextView text1;

因而在咱們編譯的時候,ButterKnifeProcessor 類的 process() 方法便會執行,搜索到全部的 ButterKnife 註解(@BindView),而後生成一個 Java 類。

根據註解,生成 Java 類

咱們在 app\build\generated\source\apt\ 中找到生成的 MainActivity$$ViewBinder 文件,該類中包含了一個 bind 方法:

public Unbinder bind(final Finder finder, final T target, Object source) {
    InnerUnbinder unbinder = createUnbinder(target);
    View view;
    view = finder.findRequiredView(source, 2131492944, "field 'text1'");
    target.text1 = finder.castView(view, 2131492944, "field 'text1'");
    return unbinder;
  }

到這裏就愈來愈像咱們手寫 findViewById() 了。

動態注入

最後當咱們執行 ButterKnife.bind(this) 時,ButterKnife 會加載上面生成的類,而後調用其 bind 方法。

  • 這裏首先調用了 findRequiredView 去尋找 R.id.text1 所對應的控件,其實至關於咱們的 findViewById()
  • 其次調用 castView,至關於類型轉換,把找到的 View 轉化爲 TextView 類型

至此,咱們就完成了一次 ButterKnife 的工做流程。

參考:

http://www.itnose.net/detail/6291539.html

Butterknife

相關文章
相關標籤/搜索