ButterKnife的优势
- 强大的View绑定和Click事 件处理功能,简化代码,提升开发效率
- 方便的 处理Adapter里的ViewHolder绑定问题
- 运行时不 会影响APP效率,使用配置方便
- 代码清晰,可读性强
ButterKnife与IoC的对比
- 共同特点:同样实现了解耦的目的
- 核心技术:运行时通过反射技术(reflect)VS注解处理器技术(APT)
- 开发使用:两者几乎- -样,傻傻分不清楚
- 代码难易: loc编程 更具挑战性
- 程序稳定:两者暂未发现致命的缺陷
- 两者缺陷: reflect会消耗一定性能, APT会增加apk大小
- 开发追求:更偏向编译期的APT技术
简单使用
增加gradle依赖
// 依赖库
// implementation 'com.jakewharton:butterknife:9.0.0-rc1'
// 注解处理器
// annotationProcessor 'com.jakewharton:butterknife-compiler:9.0.0-rc1'
在MainActivity中使用
@BindView(R.id.tv)
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
}
@OnClick(R.id.tv)
public void click(View view) {
Toast.makeText(this, tv.getText().toString(), Toast.LENGTH_SHORT).show();
}
原理分析
ButterKnife.bind(this);会找到APT生成的类文件MainActivity_ViewBinder.java,并且创建这个类的对象。
public class MainActivity_ViewBinder implements ViewBinder<MainActivity> {
@Override
public void bind(final MainActivity target) {
target.tv = target.findViewById(R.id.tv);
target.findViewById(R.id.tv).setOnClickListener(new DebouncingOnClickListener() {
@Override
public void doClick(View v) {
target.click(v);
}
});
}
}
在构造方法中, 就初始化了tv这个变量,而且给tv增加了点击事件。 这个MainActivity_ViewBinder类是在编译的时候,通过解析@BindView这个注解自动生成的。