zoukankan      html  css  js  c++  java
  • 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

    写的特别吼

  • 相关阅读:
    多线程之生产者和消费者模式
    python多线程之线程同步--锁
    python多线程之动态确定线程数
    python多线程之循环,调用函数等
    V8 引擎是如何工作的?
    AST抽象语法树——最基础的javascript重点知识,99%的人根本不了解
    字节码
    V8 引擎是如何工作的?
    JavaScript arguments对象
    V8 是怎么跑起来的 —— V8 中的对象表示
  • 原文地址:https://www.cnblogs.com/Cherrylalala/p/6027108.html
Copyright © 2011-2022 走看看