从无到有手写ButterKnife框架

导航

一、代码的演进
二、butterKnife反射调用
三、javapoet自动生成模板代码
四、apt与注解
五、注解支持多层继承
六、apt调试
七、javapoet语法

1、前言

butterknife归根结底:不用手写findviewbyId,用模板自动生成代码,减少不必要重复工作。
与其上手直接写代码,不如阐述渐进的思路,理解会透彻一些。

2、代码演进

1、最初代码

    TextView helloTv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.activity_main );
        helloTv = findViewById( R.id.helloTv );
    }

当代码变多后
2、简单封装后代码

  TextView helloTv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.activity_main );
        initView();
    }

    private void initView(){
        this.helloTv = findViewById( R.id.helloTv );
    }

3、可以更进一步封装

    TextView helloTv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.activity_main );
        initView(FirstActivity.this, getWindow().getDecorView());
    }

    private void initView(FirstActivity activity, View view ){
        activity.helloTv = view.findViewById( R.id.helloTv );
    }

4、可以将初始化控件代码专门抽出一个类

/**
 * DO NOT EDIT THIS FILE!!! IT WAS GENERATED BY CHENTONG.
 */
public class FirstActivity_ViewBinding implements Unbinder {
  private FirstActivity target;

  @UiThread
  public FirstActivity_ViewBinding(FirstActivity target, View source) {
    this.target = target;
    target.helloTv = source.findViewById( R.id.helloTv );
  }

  @Override
  public void unbind() {
    target.helloTv = null;
  }
}

看此时代码更像一个模板。

调用方式也比较固定死板

    TextView helloTv;
    Unbinder unbinder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.activity_main );
        unbinder = new FirstActivity_ViewBinding(FirstActivity.this, getWindow().getDecorView());
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbinder.unbind();
        unbinder=null;
    }

从一次一次演化,findViewById代码编写,一次比一次趋近于模板化,很套路毫无新鲜感。

日常手头重复的工作,很像模板,是时候开始改变了

从无到有手写butterKnife框架

https://github.com/yinlingchaoliu/JavaPoetDemo

你可能感兴趣的:(从无到有手写ButterKnife框架)