Retrofit不完全详解

426 阅读2分钟

1、retrofit总流程

  • 接口-注解(Build Request)
  • 网络请求执行器 Call
  • 网络请求适配器
    • CallAdapter如果用户选择了,可以通过addAdapterFactory(RxJavaCallAdapterFactory.create())将OkhttpCall对象转换成RxJava平台的Call
  • 网络请求执行器
    • 代理模式
  • 数据转换器

image.png

2、代理实例创建过程

 Retrofit mRetrofit = new Retrofit.Builder().baseUrl("myurl").
                addConverterFactory(GsonConverterFactory.create(new Gson()))
//                .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
                .build();

CommonService commonService = mRetrofit.create(CommonService.class);//CommonServiceProxy
      

2.1、创建 mRetrofit

  • 有哪些参数
  • baseURL
    • 网络请求的url地址
  • callFactory
    • 网络请求工厂,实际上就一个Okhttp
  • callbackExecutor
    • 如果不自行设置,Retrofit会根据平台设置一个默认的Executor。callbackExecutor是Retrofit.Callback接口中的一个属性,可以用来指定回调执行的线程,例如在异步请求数据时,可以在主线程之外的线程执行回调。
  • adapterFactories
    • 将Call转化,默认的话,OKhttp执行的结果会被handler来执行线程切换操作。如果需要支持RxJava,就可以通过addAdapterFactory(RxJavaCallAdapterFactory.create())将Call对象转换成RxJava平台的Call1。
  • converterFactories
    • 转换数据用的,比如string转为jsonbeanaddConverterFactory(GsonConverterFactory.create()),就是设置返回的数据支持转换为Gson对象。

image.png

2.2、mRetrofit.create()得到代理对象

ICommonService commonService = mRetrofit.create(ICommonService.class);//CommonServiceProxy
  • create里其实用了动态代理,具体看我这篇设计模式(2)-动态代理-大白话版 - 掘金 (juejin.cn)

  • 也就是commonService的任何函数都会调用invoke, 这个invoke函数也就是retrofit里面 invoke函数。所以,动态代理可以代理所有的接口,让所有的接口都走 invoke函数, 那么ICommonService里的哪些注解啥的就都被用来生成okhttpcall

  • 动态代理创建

image.png

2.3 commonService创建call

Call<Object> objectCall = commonService.addGiveLike(1001);

image.png

Mehtod和args传进了OkhttpCall,

Request request = serviceMethod.toRequest(args);

然后serviceMethod通过args参数创建了一个request,然后request生成了okhttp的call,后面的不在这一步,我大概讲一下(然后这个call enqueue()或者execute(),生成response,通过callSuccess()传出去)

serviceMethod.callAdapter.adapt(okHttpCall);

image.png image.png

  • 默认将okhttpcall转为适配适合的call(ExecutorCallbackCall)

    • defaultCallAdapterFactory是对executorCallAdapterFactory的封装。
    • executorCallAdapterFactory则是对callbackExecutor的封装,就是一个代理。

image.png

image.png

2.4 call请求然后解析数据

objectCall.enqueue(new Callback<Object>() {
    @Override
    public void onResponse(Call<Object> call, Response<Object> response) {

    }

    @Override
    public void onFailure(Call<Object> call, Throwable t) {

    }
});

这个responseConverter就是serviceMehtod里的,也就是retrofit里创建的。 image.png

image.png

image.png

3、时序图总结

image.png

image.png