我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版,欢迎购买。点击进入详情
简介
ButteKnife的优点就是可以省略对控件操作的代码,比如通常我们实例化TextView控件的方法需要这么写:TextView mTextView = findViewById(R.id.tv);
而ButterKnife则不同,只需要用注解声明,并且bind当前Activity或Fragment类即可,如下图所示:
同样对TextView的点击等事件,ButterKnife也做了简化处理。
实现原理
前面说到ButterKnife省略了很多无用的重复的代码,那这些代码去哪了呢?
这些代码肯定是存在的,那到底在哪呢?
我们发现,在build的apt目录下面有个生成的文件里面,包含了mTextView控件,然后找到对应的ViewFinder:
发现这个ViewFinder功能就是通过findViewById来找到这个mTextView控件对应的资源文件id并对其实例化;
所以,ButterKnife的原理就是在App构建的时候,通过找到每个Activity或者Fragment里面注解的变量,动态生成一些Java文件,这些Java文件里面包含了我们所需要实例化的控件,以及实例化控件的方法,在App运行的时候,加载这些生成的Java类,这样就完成了控件实例化的过程。
手写一个ButterKnife
通过前面ButterKnife的实现原理了解,我们这边归纳一下如果自己想要打造一个类似ButterKnife的框架,我们需要用到哪些功能呢?
- 注解(Annotation)
注解的作用就是标明哪些控件需要框架帮我们自动生成实例化(如findViewById)的代码; - JavaPoet(APT)
JavaPoet的作用是生成Java文件。我们可以根据JavaPoet的语法规则,手动构建java文件的内容,然后由JavaPoet生成对应的Java文件。
关于JavaPoet的详细介绍,参考:https://github.com/square/javapoet
这里我们需要写一个类extends AbstractProcessor,类名是什么无所谓。
另外AbstractProcessor的调试需要自己监控端口,在Build的时候触发调试跟踪。
优点
- 通过生成Java文件实现,而不是反射实现,不影响运行效率;
- 减少代码量,通过自动生成的代码帮我们完成,提升阅读代码和开发的效率;