Butterknife的BindView

引入:

    implementation 'com.jakewharton:butterknife:8.5.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'

butterknife的工作原理是在编译器根据扫描的注解通过JavaPoet生成一个和target(activity,fragment)对应的java文件A.java,这个生成类A(extends UnBinder)的构造方法中完成了一切实质的的绑定操作。在target中调用了bind(this)后,通过反射(target类名+_ViewBinding)获取A的构造器并实例化返回。

来看个代码,我在MainActivity中用@BindView修饰SurfaceView sv,然后make project。生成了MainActivity_ViewBinding:

// Generated code from Butter Knife. Do not modify!
package com.example.zhangyong.myapplication;

import android.support.annotation.CallSuper;
import android.support.annotation.UiThread;
import android.view.SurfaceView;
import android.view.View;
import butterknife.Unbinder;
import butterknife.internal.Utils;
import java.lang.IllegalStateException;
import java.lang.Override;

public class MainActivity_ViewBinding implements Unbinder {
  private MainActivity target;

  @UiThread
  public MainActivity_ViewBinding(MainActivity target) {
    this(target, target.getWindow().getDecorView());
  }

  @UiThread
  public MainActivity_ViewBinding(MainActivity target, View source) {
    this.target = target;

    target.sv = Utils.findRequiredViewAsType(source, R.id.sv, "field 'sv'", SurfaceView.class);
  }

  @Override
  @CallSuper
  public void unbind() {
    MainActivity target = this.target;
    if (target == null) throw new IllegalStateException("Bindings already cleared.");
    this.target = null;

    target.sv = null;
  }
}

可以看到构造器接收的参数是MainActivity,然后对被注解的属性(非private和static)进行操作,最终走的肯定还是findViewById,只不过是调用了DecorView的findViewById,可以进findRequiredViewAsType看看。

其他的一些注解就差不多了,比如设置点击事件什么的,拿到了MainActivity,也就拿到了view。

unBind里就是对这些属性赋值null,target=null的一步避免了内存泄漏。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值