TinyKnifer:手工打造一个ButterKnife

文章目录

  • 简介
  • 实现原理
  • 手写一个ButterKnife
  • 优点
  • git地址

简介

ButteKnife的优点就是可以省略对控件操作的代码,比如通常我们实例化TextView控件的方法需要这么写:TextView mTextView = findViewById(R.id.tv);
而ButterKnife则不同,只需要用注解声明,并且bind当前Activity或Fragment类即可,如下图所示:
TinyKnifer:手工打造一个ButterKnife_第1张图片
同样对TextView的点击等事件,ButterKnife也做了简化处理。

实现原理

前面说到ButterKnife省略了很多无用的重复的代码,那这些代码去哪了呢?
这些代码肯定是存在的,那到底在哪呢?
TinyKnifer:手工打造一个ButterKnife_第2张图片
我们发现,在build的apt目录下面有个生成的文件里面,包含了mTextView控件,然后找到对应的ViewFinder:
TinyKnifer:手工打造一个ButterKnife_第3张图片
发现这个ViewFinder功能就是通过findViewById来找到这个mTextView控件对应的资源文件id并对其实例化;
所以,ButterKnife的原理就是在App构建的时候,通过找到每个Activity或者Fragment里面注解的变量,动态生成一些Java文件,这些Java文件里面包含了我们所需要实例化的控件,以及实例化控件的方法,在App运行的时候,加载这些生成的Java类,这样就完成了控件实例化的过程。

手写一个ButterKnife

通过前面ButterKnife的实现原理了解,我们这边归纳一下如果自己想要打造一个类似ButterKnife的框架,我们需要用到哪些功能呢?

  1. 注解(Annotation)
    注解的作用就是标明哪些控件需要框架帮我们自动生成实例化(如findViewById)的代码;
  2. JavaPoet(APT)
    JavaPoet的作用是生成Java文件。我们可以根据JavaPoet的语法规则,手动构建java文件的内容,然后由JavaPoet生成对应的Java文件。
    关于JavaPoet的详细介绍,参考:https://github.com/square/javapoet
    这里我们需要写一个类extends AbstractProcessor,类名是什么无所谓。
    另外AbstractProcessor的调试需要自己监控端口,在Build的时候触发调试跟踪。

优点

  1. 通过生成Java文件实现,而不是反射实现,不影响运行效率;
  2. 减少代码量,通过自动生成的代码帮我们完成,提升阅读代码和开发的效率;

git地址

https://github.com/ddnosh/android-tiny-knifer

你可能感兴趣的:(Android,模块)