课程名称:BAT大牛亲授技能+技巧 Android面试快速充电升级
课程章节:Android基础相关面试问题
主讲老师:DocMike
课程内容
ButterKnife 其实是依托 Java 的注解机制来实现辅助代码生成的框架,在编译阶段实现 View 的查找,不会影响性能。具体实现过程是在编译时读入 Java 源代码,解析注解代码,生成新代码,最后生成字节码。
ButterKnife 对性能的影响很小,因为没有使用反射,而是使用的 Annotation Processing Tool(APT),注解处理器,javac 中用于编译时扫描和解析 Java 注解的工具。注解解析器不能改变读入的 Java 类,比如不能加入或删除Java 方法。
总结一下 ButterKnife 的具体实现过程。
- 扫描 Java 代码中的所有 ButterKnife 注解。
- 利用注解处理器 ButterKnifeProcessor,生成新的 Java 代码,形如 “$$ViewBinder”。
- 调用 bind() 方法加载生成的 ViewBinder 类。
使用 ButterKnife 可以实现哪些任务?
- 可以绑定一个 view,减少大量重复的模板代码,比如 findViewById。
- 可以给 view 添加点击事件。
- 可以同时给多个 view 添加点击事件。
- 可以给 ListView 添加 ItemClickListener。
最后在使用过程中需要注意的是: 使用 ButterKnife 绑定一个 View 时,不能用 Private,Static 属性。只能使用反射注入原理,通过反射获取 View。缺点是,如果 Activity 大量使用反射,非常影响性能,特别是运行时性能,容易造成卡顿。产生的很多临时变量,容易引起 Java 的垃圾回收,大量频繁的垃圾回收会引起 UI 卡顿。
课程收获
这一章介绍了注解框架 ButterKnife 的原理,在 Kotlin 出来以后,ButterKnife 的使用场景更多的被 kotlin-android-extensions 取代,现在更多使用的是 ViewBinding。虽然 ButterKnife 的使用场景减少,但了解注解框架的实现原理还是非常有必要的。