国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

自定義Android注解Part3:綁定

王晗 / 2844人閱讀

摘要:上一節我們已經將自動生成注解代碼部分介紹完畢,今天這篇文章是自定義注解系列的最后一篇文章。該部分是對我們前面定義的注解變量與自動生成的代碼進行綁定,即調用我們自動生成的代碼。

上一節我們已經將自動生成注解代碼部分介紹完畢,今天這篇文章是自定義Android注解系列的最后一篇文章。希望大家這一路走來有所收獲。

經過前面的了解,我們三大部分:butterknife-annotations、butterknife-compiler與butterknife-bind。現在就剩下最后一部分butterknife-bind。該部分是對我們前面定義的注解變量與自動生成的代碼進行綁定,即調用我們自動生成的代碼。

那么我們還是來看下butterknife-bind模板庫的結構:

只有Butterknife一個類,在這之前我們還需將前面我們已經定義好的module引入

dependencies {
    ...
    compile project(path: ":butterknife-annotations")
}

有了之前的基礎,我們Make Project項目工程,之后就可以找到MainActivity$Binding類,或者直接在/app/build/generated/source/kapt/debug/目錄下查找。

Bind

MainActivity$Binding在構造方法中就已經調用了我們的需要的bindView與setOnClickListener方法。所以我們需要使用的話只需實例化即可。但由于我們是該類是通過注解處理器自動生成的,所以我們并不知道它的類名全稱(這里我們相當于查看了源碼,才知道是以$Binding結尾)。這樣我們是不能通過new關鍵字來實例化。如此,我們又該如何實例化它呢?這時我們再來看butterknife-bind中的唯一的類Butterknife

public class Butterknife {
 
    private Butterknife() {
 
    }
 
    private static  void initialization(T target, String suffix) {
        Class tClass = target.getClass();
        String className = tClass.getName();
        try {
            Class bindingClass = tClass.getClassLoader().loadClass(className + suffix);
            Constructor constructor = bindingClass.getConstructor(tClass);
            constructor.newInstance(target);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
 
    public static void bind(Activity activity) {
        initialization(activity, ConstantUtils.BINDING_BUTTERKNIFE_SUFFIX);
    }
}

在initialization方法中,我們通過java反射來實例化我們需要的MainActivity$Binding。既然我們已經知道自動生成的類是由原始類(MainActivity)+后綴($Binding)組成。所以可以很好的使用java反射來實例化所需的類。對于外界的調用只需使用bind方法,傳入需要綁定的類即可。

Use

到這里,所以的準備工作已經完成。接下來我們可以開始在MainActivity中使用。首先將定義的庫進行依賴

dependencies {
    ...
    implementation project(":butterknife-bind")
    kapt project(":butterknife-compiler")
}

然后在MainActivity中使用

class MainActivity : AppCompatActivity() {
 
    @BindView(R.id.public_service, R.string.public_service)
    lateinit var sName: TextView
 
    @BindView(R.id.personal_wx, R.string.personal_wx)
    lateinit var sPhone: TextView
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Butterknife.bind(this)
    }
 
    @OnClick(R.id.public_service)
    fun nameClick(view: View) {
        Toast.makeText(this, getString(R.string.public_service_click_toast), Toast.LENGTH_LONG).show()
    }
 
    @OnClick(R.id.personal_wx)
    fun phoneClick(view: View) {
        Toast.makeText(this, getString(R.string.personal_wx_click_toast), Toast.LENGTH_LONG).show()
    }
}

我們使用@BindView綁定View的Id與默認值;使用@OnClick綁定點擊事件;使用Butterknife.bind(this)綁定自定義的注解代碼。這樣我們已經完成了與開源庫Butterknife相似的功能。

progurad

現在你在模擬器或者真機上跑著非常完美,然后你不小心切換到release版本并且開啟了混淆功能。這時你會發現mmp居然沒有效果。為什么呢?debug與release的區別,絕大數情況下都是混淆惹的禍。我們在實例化自動生成的類時使用的是java反射機制,所以一旦混淆了我們的java反射就找不到我們指定的類名,這樣自然也就沒有效果了。

那么我們現在又該如何解決呢?別急,是否還記得在系列的Part1我們自定義注解變量中定義了@Keep

在MainActivity$Binding類上我們使用了@Keep來標識該類,通過該標識告訴proguard不去混淆使用@Keep標記的類。要達到這種效果,我們還需經過以下兩個步驟:

1.在butterknife-bind的proguard-rules.pro文件中添加如下代碼

-keep class com.idisfkj.butterknife.annotations.Keep**
-keep @com.idisfkj.butterknife.annotations.Keep public class *
-keepclassmembers @com.idisfkj.butterknife.annotations.Keep class ** {*;}

2.為了是依賴庫的混淆生效,我們還需使用consumerProguardFiles聲明

    defaultConfig {
        ...
        consumerProguardFiles "proguard-rules.pro" //依賴庫混淆生效
    }

完成這兩步后我們在重新構建release版本,這時程序完美運行。終于可以輕松的休息會了!

End

自定義Android注解系列完美收工,希望通過這三部曲能夠幫助大家學會如何實現注解庫。最后希望大家點贊支持一下,謝謝!

文章中的代碼都可以在Github中獲取到。使用時請將分支切換到feat_annotation_processing

相關文章

自定義Android注解Part1:注解變量

自定義Android注解Part2:代碼自動生成

關注

公眾號:怪談時間到了

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71566.html

相關文章

  • 定義Android注解Part1:注解變量

    摘要:下面我們會自己實現與注解,實現中的對應注解功能。帶大家一起來聲明注解變量。知道了它的作用范圍之后,我們在自定義注解時就要盡量較小注解的作用范圍,提高項目的編譯與運行速度。它們代表自定義的注解能夠作用的對象。總結庫中的自定義注解就完成了。 showImg(https://segmentfault.com/img/bVbc08a?w=740&h=416); 對于Android注解,或多或少...

    KavenFan 評論0 收藏0

發表評論

0條評論

王晗

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<