美文网首页
Retrofit面试汇总

Retrofit面试汇总

作者: 我要离开浪浪山 | 来源:发表于2023-03-18 21:36 被阅读0次

1、Retrofit是什么?

准确来说,Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装。`

原因:网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责 网络请求接口的封装。

流程.png
上图说明了如下几点:
    1. App应用程序通过 Retrofit 请求网络,实际上是使用 Retrofit 接口层封装请求参数、Header、Url 等信息,之后由 OkHttp 完成后续的请求操作。
    1. 在服务端返回数据之后,OkHttp 将原始的结果交给 Retrofit,Retrofit根据用户的需求对结果进行解析。

注意:Retrofit 通过 java 接口以及注解来描述网络请求,并用动态代理的方式生成网络请求的 request,然后通过 client 调用相应的网络框架(默认 okhttp)去发起网络请求,并将返回的 response 通过 converterFactorty 转换成相应的数据 model,最后通过 calladapter 转换成其他数据方式(如 rxjava Observable)

2、Retrofit 流程

  • 1、添加Retrofit依赖,网络权限
  • 2、定义接收服务器返回数据的Bean
  • 3、创建网络请求的接口,使用注解(动态代理,核心)
  • 4、 builder模式创建Retrofit实例,converter,calladapter…
  • 5、创建接口实例,调用具体的网络请求
  • 6、call同步/异步网络请求
  • 7、处理服务器返回的数据

3、Retrofit 优点

  • 可以配置不同 HTTP client 来实现网络请求,如 okhttp、httpclient 等;
  • 请求的方法参数注解都可以定制;
  • 支持同步、异步和 RxJava;
  • 超级解耦;
  • 可以配置不同的反序列化工具来解析数据,如 json、xml 等
  • 框架使用了很多设计模式

4、Retrofit 中的数据究竟是怎么处理的?它是怎么返回 RxJava.Observable 的?

Retrofit 中的数据其实是交给了 callAdapter 以及 converter 去处理,callAdapter 负责把 okHttpCall 转成我们所需的 Observable 类型, converter 负责把服务器返回的数据转成具体的实体类。

5、动态代理和静态代理的区别?

  • 1、静态代理类由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
  • 2、动态代理类是在程序运行期间由 JVM 根据反射等机制动态的生成,所以不存在代理类的字节码文件。代理类和委托类的关系是在程序运行时确定。

6、使用的设计模式

  • 外观模式,
  • 构建者模式,
  • 工厂模式,
  • 代理模式,
  • 适配器模式,
  • 策略模式,
  • 装饰模式,
  • 1、Retrofit 实例使用建造者模式通过Builder类构建。 当构造函数的参数大于4个,且存在可选参数的时候既可以使用 建造者设计模式
  • 2、Retrofit 创建时的callFactory,使用工厂方法设计模式,但是似乎并不打算支持其他的工厂。
  • 3、整个retrofit 采用的时外观模式。统一的调用创建网络请求接口实例和网络请求参数配置的方法
  • 4、retrofit里面使用了动态代理来创建网络请求接口实例,这个是retrofit对用户使用来说最大的复用,其它的代码都是为了支撑这个动态代理给用户带来便捷性的
  • 5、使用了策略模式对serviceMethod对象进行网络请求参数配置,即通过解析网络请求接口方法的参数、返回值和注解类型,从Retrofit对象中获取对应的网络的url地址、网络请求执行器、网络请求适配器和数据转换器
  • 6、ExecuteCallBack 使用装饰者模式来封装callbackExecutor,用于完成线程的切换
  • 7、ExecutorCallbackCall 使用静态代理(委托) 代理了Call进行网络请求,真正的网络请求由okhttpCall执行,然而okHttpCall不是自己执行,它是okhttp 提供call给 外界(retrofit)使用的唯一门户,其实这个地方就是门面模式
  • 8、ExecutorCallbackCall 的被初始化是在 ExecutorCallAdapterFactory里面通过适配器模式被创建的。CallAdapter采用了适配器模式为创建访问Call接口提供服务。默认不添加Rxjava则使用默认的ExecutorCallAdapterFactory 将okhttp3.call转变成为 retroift中的call,如果有Rxjava则将okhttp3.call转化为abservable。

7、Retrofit 如何切换线程的?

// 代码2
// 添加一个线程管理 Executor,okhttp 切换线程需要手动操作,但是retrofit 不需要,就是因为这个Executor 的存在,其实他是handler

Executor callbackExecutor = this.callbackExecutor;      
 if (callbackExecutor == null) {       
 callbackExecutor = platform.defaultCallbackExecutor();     
}

网络请求需要在子线程中执行,那么就需要线程管理,所以就有了代码2的存在,深入源码后发现,这个地方就是运用handler进行线程切换,当网络请求回来了进行线程切换,可以看下面的源码

static final class Android extends Platform {    
      Android() {     
            super(Build.VERSION.SDK_INT >= 24);   
      }    
     @Override 
    public Executor defaultCallbackExecutor() {      
          return new MainThreadExecutor();  
     }    

    static class MainThreadExecutor implements Executor {     
         private final Handler handler = new Handler(Looper.getMainLooper());      
       @Override public void execute(Runnable r) {         
             handler.post(r);    
        }   
   } 
}

相关文章

网友评论

      本文标题:Retrofit面试汇总

      本文链接:https://www.haomeiwen.com/subject/kllerdtx.html