• 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

    写的特别吼

  • 相关阅读:
    2020多校补题集
    2020牛客多校第10场C Decrement on the Tree树上路径删除
    主席树模板(查询区间第K大的元素)
    第一次小赛
    计算几何小知识整理
    咸鱼暂时退圈
    mysql 格式化时间
    mysql 中国省份城市数据库表
    CF786B Legacy (线段树优化建图模板)
    树上两点期望距离
  • 原文地址:https://www.cnblogs.com/Cherrylalala/p/6027108.html
Copyright © 2020-2023  润新知