简介

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

实现原理

前面说到ButterKnife省略了很多无用的重复的代码,那这些代码去哪了呢?
这些代码肯定是存在的,那到底在哪呢?
TinyKnifer: 手工打造一个ButterKnife
我们发现,在build的apt目录下面有个生成的文件里面,包含了mTextView控件,然后找到对应的ViewFinder:
TinyKnifer: 手工打造一个ButterKnife
发现这个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

相关文章:

  • 2021-12-02
  • 2021-10-15
  • 2021-06-29
  • 2021-09-05
  • 2021-07-26
  • 2021-07-24
猜你喜欢
  • 2022-12-23
  • 2021-06-14
  • 2021-11-13
  • 2021-05-26
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案