ButterKnife-- ButterKnife.bind(this); @BindView(R.id.bottomSelectView) BottomSelectView bottomSelectView;

参考:

http://bxbxbai.github.io/2016/03/12/how-butterknife-works/?utm_source=tuicool&utm_medium=referral

 

理解原理:

发现ButterKnife的原理不是:

在 bind(this) 方法执行的时候通过反射获取Activity 中所有的带有 @Bind 注解的属性并且获得注解中的 R.id.xxx 值,

最后还是通过反射拿到 Activity.findViewById() 方法获取View,并赋值给 Activity中的某个属性

这是一个注解库的实现方式,比较原始

缺点:在Activity运行时大量使用反射会影响App的运行性能,造成卡顿以及生成很多临时Java对象更容易触发GC

ButterKnife 实际是用了Java Annotation Processing技术【Annotation processing 是javac中用于编译时 扫描 和 解析Java注解的工具】

就是在Java代码编译成Java字节码的时候就已经处理了 @Bind 、 @OnClick (ButterKnife还支持很多其他的注解)这些注解了

-----------------割------------------------------

Annotation processing是在编译阶段执行的,

原理:读入Java源代码——解析注解——生成新的Java代码——被编译成Java字节码

注解解析器(Annotation Processor)不能改变读入的Java 类,比如不能加入或删除Java方法

 

ButterKnife 工作流程

当你编译你的Android工程时,ButterKnife工程中 ButterKnifeProcessor 类的 process() 方法会执行以下操作:

  • 开始它会扫描Java代码中所有的ButterKnife注解 @Bind 、 @OnClick 、 @OnItemClicked 等
  • 当它发现一个类中含有任何一个注解时, ButterKnifeProcessor 会帮你生成一个Java类,名字类似 <className>$$ViewBinder ,这个新生成的类实现了 ViewBinder<T> 接口
  • 这个 ViewBinder 类中包含了所有对应的代码,比如 @Bind 注解对应 findViewById() , @OnClick 对应了 view.setOnClickListener() 等等
  • 最后当Activity启动 ButterKnife.bind(this) 执行时,ButterKnife会去加载对应的 ViewBinder 类调用它们的 bind() 方法

@Bind@OnClick等注解标注的属性或方法必须是public或protected的,因为ButterKnife是通过ExampleActivity.this.editText来注入View的,否则如果是priivate 就得用反射了,会影响性能

 

优势:绑定view,设置监听特别容易

       还不会多么影响性能

不过感觉可读性不是很强····

关于如何在AS中配置和使用ButterKnife:请看

http://blog.csdn.net/a873228446/article/details/51831754

写的特别吼

 

posted @ 2016-11-03 16:21  Nicolellu  阅读(785)  评论(0编辑  收藏  举报