Android库面试题

 

有了解过Glide的实现吗?

可以分为四个模块:资源封装、构造请求、执行请求、图片缓存; 资源封装、构造请求、执行请求只是对Android和其它网络请求库API的抽象,方便统一操作;关键在于图片缓存。 Glide使用了三级缓存:BitmapPool、内存缓存、磁盘缓存。 BitmapPool实现了复用Bitmap对象,减少了Bitmap对象的创建和回收; 内存缓存、磁盘缓存使用了Lru算法,具体实现是使用LinkedHashMap,把access设置为true。

Glide用了哪些设计模式?

1、单例模式 全局只有一个Glide对象 2、建造者模式 构造请求对象的时候

有了解过Retrofit的实现吗?

基于OkHttp, 1、使用代理模式实现声明式请求; 在构造请求对象时会解析方法的注解作为参数 2、使用责任链模式添加了缓存请求、Cookie等功能; 默认实现有5个拦截器,每个负责不同的功能;并且可以自定义拦截器,我自定义拦截器实现对返回数据的解析和转化; 3、使用适配器模式,可以与RxJava适配。

Retrofit用了哪些设计模式?

如上。还有单例、建造者。

你在哪些情况下会使用建造者模式?

1、构造方法中参数较多; 2、参数需要按顺序赋值。

建造者模式和工厂模式有什么区别?

工厂模式对用户隐藏构造对象的细节,用户只需要说要什么产品,就可以得到; 建造者模式对用户暴露构造对象的细节,相当于用户在定制产品。

是否可以用代理模式代替适配器模式?

不能。 代理模式提供的接口和原本是一样的,目的是增强原本方法实现的功能; 适配器模式提供的接口和原本是不一样的,目的是转换接口。

EventBus的实现原理是什么?

1、注册事件 用注解标注方法,可以指定threadMode、sticky、priority三个属性。在注册时,EventBus利用反射机制解析注解,构造出SubscriberMethod对象,然后以EventType对象为键,以SubscriberMethod对象为值,保存到HashMap中。 2、发送事件 先把事件发送到队列,再一个个处理。从HashMap中找到保存的SubscriberMethod对象。 3、处理事件 使用反射机制,按不同的线程模式在不同的线程执行方法;如果跨线程,会使用到Handler。

EventBus如何处理大量接收器的情况?

EventBus 提供了在项目编译时通过注解处理器查找订阅事件方法信息的方式,生成一个辅助的索引类来保存这些信息,这个索引类就是Subscriber Index。Subscriber Index 的核心就是项目编译时使用注解处理器生成保存事件订阅方法信息的索引类,然后项目运行时将索引类实例设置到 EventBus 中,这样当注册 EventBus 时,从索引类取出当前注册类对应的事件订阅方法信息,以完成最终的注册,避免了运行时反射处理的过程,所以在性能上会有质的提高。

用过RxJava的哪些操作符?

详见《RxJava概述》