面试记录第十二节——(Butterknife 注入框架)

一、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,那么这个框架他就不能通过注解的方式来获取了,只能通过反射来获取,此时不管你的性能有多快,都会影响性能。这是必须注意并且避免的。这也就是和其他注解方式不通的一点。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值