ButterKnife,早起的android 程序员都知道有这么一个库,他的出现主要是为了少让我们写findviewByid(),现在的项目中findviewByid 这个很少能看到了。因为现在可以通过DataBinding技术直接实现双向绑定,也是google 推荐的做法。
今天我们是通过注解和反射的技术来实现类似Butter Knife的实现。
ButterKnife在使用的时候我们都知道是需要在查找控件上添加个注解@BindView(R.id.xxx),那么我们就需要先实现这个注解
一、注解类的实现
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface BindView {
int value();
}
如果有对注解不理解的小伙伴可以到xxxxx去先查看注解的使用。
我们要知道一个原理性的东西,那就是我们只创建出来注解是没有用的,是需要结合我们实际情况拿到有注解的字段、方法、类,完成我们的逻辑需求的。
接下来我们就需要实现一个解析注解的类,是通过反射技术实现的。
二、解析类的实现
public class Bind {
public static void binding(Activity activity) {
Class<? extends Activity> aClass = activity.getClass();
try {
for (Field declaredField : aClass.getDeclaredFields()) {
BindView bindView = declaredField.getAnnotation(BindView.class);
if (bindView != null) {
declaredField.setAccessible(true);
declaredField.set(activity, activity.findViewById(bindView.value()));
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
我们通过静态的binding方法就可以来实现把activity中所有有BindView注解的字段给自动执行findViewByid().是不是特别简单。
不过以上代码只是demo,并不是ButterKnife 的真正实现。
反射大家都知道是会有性能消耗的,如果一两个字段通过反射来完成还好。但是如果用户界面有几十个view是通过反射来实现的那么就会造成明显的卡顿。
我们可以通过 AnnotationProcessor 来实现高性能的ButterKnife。






网友评论