ButterKnife是用来解放开发者的,避免重复编写findViewById,setOnClickListener等操作,也就是说,其实这是一个用来提高开发效率的框架,当然,现在kotlin语言已经流行起来,直接用id就可以访问到view,故相应该框架的优点也稍微被弱化了。
今天我们来说说ButterKnife的原理:
1)在编译期,使用annotationProcessor技术(与APT类似,是一种注解处理器)对代码进行扫描,查找出相应注解,比如BindView,收集所需的相关信息并进行整理
2)使用JavaPoet将上述收集整理好的信息生成一个已“_ViewBinding”为结尾的类,这是一个辅助类,同样在编译期完成的
3)当调用ButterKnife.bind(x)方法后,会动态加载当前类的辅助类(类名=当前类名+“_ViewBinding”),并通过反射机制获取到辅助类的一个实例,并返回该实例(因为所有辅助类都实现了Unbinder接口,所以bind方法返回的是一个Unbinder,通常我们获取该Unbinder调用unbind()来进行解绑)
4)上述获取到辅助类实例的过程,已经在辅助类的构造函数中进行了findViewById,setOnClickListener等操作,至此便完成了整个框架的流程。
另外,我们说说该框架的一些影响:
1)当编译完成后,你可在以下路径查找到对应生成的辅助类:app/build/generated/source/apt/debug/你的包名及路径/xxx_ViewBinding.java,由于该辅助类是在编译期完成的,所以对运行时的性能并不产生影响。
2)因为对每个需要用到ButterKnife的类都需生成一个辅助类,并且该辅助类也会一同打包进apk中去,故稍稍会增大安装包的大小。
详细的代码分析可参考:https://www.jianshu.com/p/39fc66aa3297
网友评论