一、Butterknife 注入框架面试使用简介
答:ButterKnife是一个专注于Android系统的View注入框架,可以减少大量的findViewById以及setOnClickListener代码,可视化一键生成。如下图所示
二、ButterKnife 优势
答:
1、强大的View绑定和Click事件处理功能,简化代码,提升开发效率
2、方便的处理Adapter里的ViewHolder绑定问题
3、运行时不会影响APP效率,使用配置方便
4、代码清晰,
三、Butterknifi原理
答:
1、有一个错觉,就是大家一提到框架就会想到反射,因为很多其他的注入框架就是使用反射来实现的,但是反射来实现注入的框架它有很多不好的地方,也就是activity在运行时,会大量的使用反射,而反射会影响我们的性能,特别是运行时的性能,它容易造成卡顿,它有会产生很多的临时变量,临时变量又会引起垃圾回收。我们UI优化的时候,大量的频繁的垃圾回收,会造成UI卡吨,而UI卡吨也是性能的标志之一。
2、而我们的butterknife没有使用这样的方法。butterknife使用的是java的注解处理技术,也就是在代码编译的时候,编译成字节码的时候,它就处理好了注解操作
注意:java的注解处理技术是在编译阶段执行的,它的原理是通过读入我们的源代码,解析注解然后生产新的java代码,而新生产的java代码当中,最后被编译成java字节码,由于注解解释器它是不能改变读入的java类的。这就是butterknife的注解原理。
四、Butterknifi 的一种配置方式
答:
- 1、
五、Butterknifi 的inject()方法介绍
答:inject()方法的源码()
public class MainActivity extends AppCompatActivity {
@InjectView(R.id.button1)
Button button1;
@InjectView(R.id.activity_main)
RelativeLayout activityMain;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.inject(this);
}
@OnClick({R.id.button1, R.id.activity_main})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.button1:
break;
case R.id.activity_main:
break;
}
}
}
上面oncreate()方法中inject方法作用?
答:我们来看看inject()方法的源码如下:
//这个方法我们会看到,他执行的inject()方法,里面有三个参数。我们继续点击进去
public static void inject(Activity target) {
inject(target, target, Finder.ACTIVITY);
}
源码如下:
static void inject(Object target, Object source, Finder finder) {
Class<?> targetClass = target.getClass();
try {
if (debug) Log.d(TAG, "Looking up view injector for " + targetClass.getName());
//此处的findInjectorForClass很重要,它主要作用就是把刚才我们绑定的注解和我们的java源代码进行结合
Method inject = findInjectorForClass(targetClass);
if (inject != null) {
inject.invoke(null, finder, target, source);
}
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
Throwable t = e;
if (t instanceof InvocationTargetException) {
t = t.getCause();
}
throw new RuntimeException("Unable to inject views for " + target, t);
}
}
问:绑定view的时候,为什么不能private和static。
答:因为性能问题,如图我们我们把这个view设置成private,那么这个框架他就不能通过注解的方式来获取了,只能通过反射来获取,此时不管你的性能有多快,都会影响性能。这是必须注意并且避免的。这也就是和其他注解方式不通的一点。