点亮技能之ButterKnife使用及原理

一,写在前面

       这篇文章将介绍ButterKnife框架的一些基本使用,并会介绍ButterKnife的实现原理。由于ButterKnife是以注解的形式被使用,阅读本篇文章需要读者有Java注解相关的知识。对Java注解不太了解的可参考文章Java注解,文章中涉及注解的知识将不再阐述。

本文将包括如下内容:

  • ButterKnife框架背景介绍
  • 为什么要使用ButterKnife
  • ButterKnife的基本使用 
  • ButterKnife原理浅析

 

二,轻松聊背景

       ButterKnife是Square公司前工程师Jake Wharton,开发的一款Android框架,主要用于替换传统的findViewById获取控件引用,以及setOnClickListener...等设置监听的方法。在离开伟大的Square公司前,Jake Wharton经常被google邀请参加一些技术分享,然后结局嘛~顺利被挖走啦。于2017年正式入职Google,一家更伟大的公司。为啥说square是一家伟大的公司呢,因为如今很多常用的开源框架都是该公司开源的,大大方便了开发者。

 

三,凭什么使用ButterKnife

       不知道大家有木有发现,在一个项目越来越大界面越来越多时,每当我们写好了界面,就要在Activity里敲那些重复到吐的findViewByid。俺在工作中就遇到领导要求写个测试接口的apk,而且一看接口有十多个,需要写十多个按钮,findViewByid,setOnClickListener十多次,有种写吐的感觉。那么,使用ButterKnife框架就可以不用写findViewById,setOnClickListener这些重复的代码,当然ButterKnife的用处远不止这些。

       对注解的同学一定知道,注解放在一个元素上面就像该元素的一个标签,注解在编译,运行阶段本身没有任何效果。要想注解生效,必须要人为的处理注解,有两种方式:反射提取注解注解处理器生成辅助类。文章Java注解里介绍了如何使用反射提取注解,这里不再阐述,注解处理器在后面讲到实现原理这块会做简单的介绍。我们知道用反射提取注解有个缺点:使用反射“曲线救国”的方式调用方法,不如直接调用方法快。且反射是在运行阶段执行,运行阶段花费太多时间,会消耗应用一定性能。

       也就是说,反射是在运行阶段处理注解对性能灰常不友好,那么能不能将处理注解的操作放在编译阶段呢?答案是,可以,注解处理器就是做的这件事。注解处理器会对整个源码的特定注解(ButterKnife规定使用的注解)进行解析,并将数据存放在Map集合中,最终通过JavaPoet开源库提供的API将集合里数据转化为Java源代码。也就是说,注解处理器生成了Java源码,该Java文件在module特定的目录中(后面会具体介绍),这些Java源码都是一些辅助类,用于帮助开发者完成findViewById等操作。可想而知,ButterKnife框架处理注解是在编译阶段,即采用注解处理器生成一些辅助类,减少性能的损耗

 

四,ButterKnife的使用

使用ButterKnife就是使用一堆注解,可使用注解包括:BindView,BindViews,BindColor,BindDimen,BindDrawable,BindString,OnClick,onLongClick...等,完整注解参考ButterKnife注解

在使用ButterKnife框架前,需要在app的build.gradle文件里添加一些依赖:

dependencies {
    //...

    
    implementation 'com.jakewharton:butterknife:8.5.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
}

 

Activity中使用ButterKnife

@BindView注解:绑定View

首先来看下面一个activity_main.xml布局文件,代码如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="www.abc.com.butterknife.MainActivity">

    <TextView
        android:id="@+id/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:textSize="14sp"
        android:text="@string/textview_name"/>

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/button_name"
        android:layout_below="@+id/text1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"/>

    <EditText
        android:id="@+id/edittext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/button"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"
        android:text="@string/edittext_name"/>

    <ImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
     
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值