Retrofit源码解析

16 篇文章 0 订阅
10 篇文章 0 订阅

Retrofit源码解析

Retrofit概述

Retrofi是对OkHttp的封装,简化了网络请求。

使用Retrofi完成网络请求的一般步骤如下:

  1. 使用Retrofit定义的 http注解,定义一个与Http API对应的java接口。
  2. 实例化一个Retrofit实例
  3. 调用Retrofit.create()方法,并将定义好的接口的类类型传递给这个方法,获得这个接口的一个动态代理对象。
  4. 使用动态代理对象,调用接口的方法,获得对应的Call对象。
  5. 使用Call对象发送同步或者异步Http请求
  6. 读取请求的结果。

下面通过源码,分析Retrofit的实现原理。

使用Retrofit的 http注解,定义Http API的java接口

使用Retrofit的第一步是定义与Http API相对应的Java接口。通常,我们将与一个功能模块相关联的Http API定义成一个Java接口,接口的每一个接口方法对应一个Http API。

在retrofit.http包里,定义了一系列的注解,用来描述与 Htttp API相对应的接口方法,主要分为两大类:

  1. method类型的注解,对接口方法进行描述
  2. parameter类型的注解,对接口的参数进行描述。

这些注解用于在运行时调用的接口方法的时候,获取接口方法的原信息,并根据这些原信息生成对应的OkHttpCall,即通过这些原信息,生成一个OkHttp 的Request。在下面的章节将会看到,Retrofit是如何利用这些注解信息的--反射。

实例化一个Retrofit对象

实例化一个Retrofit对象十分简单,Retrofit提供了典型的建造者模式,来获得Retrofit实例,这里就不再赘述。

调用Retrofit.create()方法,获取接口的动态代理对象

举个例子

 public interface GitHub {
    @GET("/repos/{owner}/{repo}/contributors")
    Call<List<Contributor>> contributors(
    @Path("owner") String owner,
    @Path("repo") String repo);
}

GitHub是我们定义的一个Http API的java接口,

我们获取这个接口的动态代理对象通常是这样的:

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(API_URL)
    .addConverterFactory(GsonConverterFactory.create())
    .build();

// Create an instance of our GitHub API interface.
GitHub github = retrofit.create(GitHub.class);

下面看看 retrofit.create()的源码

public <T> T create(final Class<T> service) {
    Utils.validateServiceInterface(service);
    if (validateEagerly) {
        eagerlyValidateMethods(service);
    }
    return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[]{service},
            new InvocationHandler() {
                private final Platform platform = Platform.get();

                @Override
                public Object invoke(Object proxy, Method method, @Nullable Object[] args)
                        throws Throwable {
                    // If the method is a method from Object then defer to normal invocation.
                    if (method.getDeclaringClass() == Object.class) {
                        return method.invoke(this, args);
                    }
                    if (platform.isDefaultMethod(method)) {
                        return platform.invokeDefaultMethod(method, service, proxy, args);
                    }
                    ServiceMethod<Object, Object> serviceMethod =
                            (ServiceMethod<Object, Object>) loadServiceMethod(method);
                    OkHttpCall<Object> okHttpCall = new OkHttpCall<>(serviceMethod, args);
                    return serviceMethod.callAdapter.adapt(okHttpCall);
                }
            });
}

可以看到,首先检查这个类类型是否合法,然后返回了参数类的一个动态代理对象。

这个类类型必须是一个接口类型,而且这个接口不能继承其他接口,也就是说,Http API必须定义成接口的形式,而且不允许继承其他接口

使用动态代理对象,调用接口的方法,获得对应的Call对象

获得代理对象后,接下来就要调用被代理对象的方法。

Call<List<Contributor>> call = github.contributors("square", "retrofit");

通过以上分析可以知道,调用被代理对象的方法时,会调用动态代理对象的InvocationHandler.invoke()方法,调用的方法对应 Method参数,Method的参数列表对应 Object[] args参数。

invoke()方法的逻辑很清楚:

如果是Object的方法,则执行之;如果是Platfrom的方法,这有platform执行之;否则返回Method对应的Call对象。

下面重点分析这个Call对象是如何生成的。

一、根据调用的Method,生成一个ServiceMethod对象。

ServiceMethod<?, ?> loadServiceMethod(Method method) {
    ServiceMethod<?, ?> result = serviceMethodCache.get(method);
    if (result != null) return result;

    synchronized (serviceMethodCache) {
        result = serviceMethodCache.get(method);
        if (result == null) {
            result = new ServiceMethod.Builder<>(this, method).build();
            serviceMethodCache.put(method, result);
        }
    }
    return result;
}

可以看到,Retrofit维护了一个ServiceMethod的缓存,首先在缓存里面找,看有没有对应的ServiceMethod,如果找到,直接返回;否则创建之并添加到缓存。这样做节约了时间,避免重复解析ServiceMethod。

可以看到,ServiceMethod是通过建造者模式实例化的。下面看看它的实例化过程:

Builder(Retrofit retrofit, Method method) {
  this.retrofit = retrofit;
  this.method = method;
  this.methodAnnotations = method.getAnnotations();
  this.parameterTypes = method.getGenericParameterTypes();
  this.parameterAnnotationsArray = method.getParameterAnnotations();
}

可以看到,首先是根据Method,通过反射机制,获取Method的注解,参数类型和参数注解,也就是在声明接口时使用的Retrofit提供的Http 注解。

下面看看,利用这些信息,Retrofit做了什么。

在Builder.build()方法里有这么一段:

   for (Annotation annotation : methodAnnotations) {
    parseMethodAnnotation(annotation);
  }

这是对接口的注解信息进行遍历并解析。

private void parseMethodAnnotation(Annotation annotation) {
  if (annotation instanceof DELETE) {
    parseHttpMethodAndPath("DELETE", ((DELETE) annotation).value(), false);
  } else if (annotation instanceof GET) {
    parseHttpMethodAndPath("GET", ((GET) annotation).value(), false);
  } else if (annotation instanceof HEAD) {
    parseHttpMethodAndPath("HEAD", ((HEAD) annotation).value(), false);
    if (!Void.class.equals(responseType)) {
      throw methodError("HEAD method must use Void as response type.");
    }
  } else if (annotation instanceof PATCH) {
    parseHttpMethodAndPath("PATCH", ((PATCH) annotation).value(), true);
  } else if (annotation instanceof POST) {
    parseHttpMethodAndPath("POST", ((POST) annotation).value(), true);
  } else if (annotation instanceof PUT) {
    parseHttpMethodAndPath("PUT", ((PUT) annotation).value(), true);
  } else if (annotation instanceof OPTIONS) {
    parseHttpMethodAndPath("OPTIONS", ((OPTIONS) annotation).value(), false);
  } else if (annotation instanceof HTTP) {
    HTTP http = (HTTP) annotation;
    parseHttpMethodAndPath(http.method(), http.path(), http.hasBody());
  } else if (annotation instanceof retrofit2.http.Headers) {
    String[] headersToParse = ((retrofit2.http.Headers) annotation).value();
    if (headersToParse.length == 0) {
      throw methodError("@Headers annotation is empty.");
    }
    headers = parseHeaders(headersToParse);
  } else if (annotation instanceof Multipart) {
    if (isFormEncoded) {
      throw methodError("Only one encoding annotation is allowed.");
    }
    isMultipart = true;
  } else if (annotation instanceof FormUrlEncoded) {
    if (isMultipart) {
      throw methodError("Only one encoding annotation is allowed.");
    }
    isFormEncoded = true;
  }
}

可以看到,注解信息就是在这里被解析的。具体的解析过程就不再过多的分析。

另外,在build()方法里,还有这么一段代码

 callAdapter = createCallAdapter();
  responseType = callAdapter.responseType();
  if (responseType == Response.class || responseType == okhttp3.Response.class) {
    throw methodError("'"
        + Utils.getRawType(responseType).getName()
        + "' is not a valid response body type. Did you mean ResponseBody?");
  }
  responseConverter = createResponseConverter();

不知道是用来做什么的,不要急,下面将会讲到。

二、创建OkHttpCall,并返回

在动态代理的invoke方法里,有这样两行代码:

OkHttpCall<Object> okHttpCall = new OkHttpCall<>(serviceMethod, args);
return serviceMethod.callAdapter.adapt(okHttpCall);

很明显,创建了一个OkHttp对象,并返回了一个serviceMethod.callAdapter.adapt(okHttpCall),那么,返回类型到底是个什么呢?这要随Retrofit的使用平台有关。

可以看到,返回值是erviceMethod.callAdapter.adapt()的返回值,而 serviceMethod.callAdapter就是ServiceMethod.Builder的CallAdapter,这里不得不提上面我们

 callAdapter = createCallAdapter();


 private CallAdapter<T, R> createCallAdapter() {
  Type returnType = method.getGenericReturnType();
  if (Utils.hasUnresolvableType(returnType)) {
    throw methodError(
        "Method return type must not include a type variable or wildcard: %s", returnType);
  }
  if (returnType == void.class) {
    throw methodError("Service methods cannot return void.");
  }
  Annotation[] annotations = method.getAnnotations();
  try {
    //noinspection unchecked
    return (CallAdapter<T, R>) retrofit.callAdapter(returnType, annotations);
  } catch (RuntimeException e) { // Wide exception range because factories are user code.
    throw methodError(e, "Unable to create call adapter for %s", returnType);
  }
}

这个方法获取了接口方法的泛型返回值类型和注解,最终调用了retrofit.callAdapter(returnType, annotations)

public CallAdapter<?, ?> callAdapter(Type returnType, Annotation[] annotations) {
    return nextCallAdapter(null, returnType, annotations);
}

/**
 * Returns the {@link CallAdapter} for {@code returnType} from the available {@linkplain
 * #callAdapterFactories() factories} except {@code skipPast}.
 *
 * @throws IllegalArgumentException if no call adapter available for {@code type}.
 */
public CallAdapter<?, ?> nextCallAdapter(@Nullable CallAdapter.Factory skipPast, Type returnType,
                                         Annotation[] annotations) {
    checkNotNull(returnType, "returnType == null");
    checkNotNull(annotations, "annotations == null");

    int start = adapterFactories.indexOf(skipPast) + 1;
    for (int i = start, count = adapterFactories.size(); i < count; i++) {
        CallAdapter<?, ?> adapter = adapterFactories.get(i).get(returnType, annotations, this);
        if (adapter != null) {
            return adapter;
        }
    }

    StringBuilder builder = new StringBuilder("Could not locate call adapter for ")
            .append(returnType)
            .append(".\n");
    if (skipPast != null) {
        builder.append("  Skipped:");
        for (int i = 0; i < start; i++) {
            builder.append("\n   * ").append(adapterFactories.get(i).getClass().getName());
        }
        builder.append('\n');
    }
    builder.append("  Tried:");
    for (int i = start, count = adapterFactories.size(); i < count; i++) {
        builder.append("\n   * ").append(adapterFactories.get(i).getClass().getName());
    }
    throw new IllegalArgumentException(builder.toString());
}

继续跟下去,发现这个CallAdapter是通过adapterFactories获得的。最后在Retrofit.Builder里找到了答案:

public Retrofit build() {
        if (baseUrl == null) {
            throw new IllegalStateException("Base URL required.");
        }

        okhttp3.Call.Factory callFactory = this.callFactory;
        if (callFactory == null) {
            callFactory = new OkHttpClient();
        }

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

        // Make a defensive copy of the adapters and add the default Call adapter.
        List<CallAdapter.Factory> adapterFactories = new ArrayList<>(this.adapterFactories);
        adapterFactories.add(platform.defaultCallAdapterFactory(callbackExecutor));

        // Make a defensive copy of the converters.
        List<Converter.Factory> converterFactories = new ArrayList<>(this.converterFactories);

        return new Retrofit(callFactory, baseUrl, converterFactories, adapterFactories,
                callbackExecutor, validateEagerly);
    }

可以看到,AdpterFactory的实例化是通过 platform.defaultCallAdapterFactory(callbackExecutor)进行的;

在Retrofit里,提供了三种Platform实现,用于表示Retrofit的使用环境,分别是默认实现、Java8实现和Android实现,要知道这个方法究竟调用的是哪个实现,需要知道Platform是如何实例化的。

那么这个Platform对象是如何实例化的呢?

  Builder(Retrofit retrofit) {
        platform = Platform.get();
        callFactory = retrofit.callFactory;
        baseUrl = retrofit.baseUrl;
        converterFactories.addAll(retrofit.converterFactories);
        adapterFactories.addAll(retrofit.adapterFactories);
        // Remove the default, platform-aware call adapter added by build().
        adapterFactories.remove(adapterFactories.size() - 1);
        callbackExecutor = retrofit.callbackExecutor;
        validateEagerly = retrofit.validateEagerly;
    }

可以看到,在Retrofit创建的时候,会调用 Platform.get();

 static Platform get() {
    return PLATFORM;
}

private static Platform findPlatform() {
    try {
        Class.forName("android.os.Build");
        if (Build.VERSION.SDK_INT != 0) {
            return new Android();
        }
    } catch (ClassNotFoundException ignored) {
    }
    try {
        Class.forName("java.util.Optional");
        return new Java8();
    } catch (ClassNotFoundException ignored) {
    }
    return new Platform();
}

这段代码会根据实际的运行环境,通过反射机制动态的实例化Platform。

好了,那我们分别分析一下,不同Platform环境下,defaultCallAdapterFactory的实现。

static class Android extends Platform {
    @Override
    public Executor defaultCallbackExecutor() {
        return new MainThreadExecutor();
    }

    @Override
    CallAdapter.Factory defaultCallAdapterFactory(@Nullable Executor callbackExecutor) {
        if (callbackExecutor == null) throw new AssertionError();
        return new ExecutorCallAdapterFactory(callbackExecutor);
    }

    static class MainThreadExecutor implements Executor {
        private final Handler handler = new Handler(Looper.getMainLooper());

        @Override
        public void execute(Runnable r) {
            handler.post(r);
        }
    }
}

可以看到对于Android,都是返回的ExecutorCallAdapterFactory,而对于其他的平台,要视情况而定。

 CallAdapter.Factory defaultCallAdapterFactory(@Nullable Executor callbackExecutor) {
    if (callbackExecutor != null) {
        return new ExecutorCallAdapterFactory(callbackExecutor);
    }
    return DefaultCallAdapterFactory.INSTANCE;
}

如果指定了callbackExecutor 就返回 ExecutorCallAdapterFactory,否则返回 DefaultCallAdapterFactory。

那么这两者有什么区别呢?

final class DefaultCallAdapterFactory extends CallAdapter.Factory {
    static final CallAdapter.Factory INSTANCE = new DefaultCallAdapterFactory();
    @Override
    public CallAdapter<?, ?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) {
        if (getRawType(returnType) != Call.class) {
          return null;
        }

        final Type responseType = Utils.getCallResponseType(returnType);
        return new CallAdapter<Object, Call<?>>() {
          @Override public Type responseType() {
            return responseType;
          }

          @Override public Call<Object> adapt(Call<Object> call) {
            return call;
          }
        };
    }
}



final class ExecutorCallAdapterFactory extends CallAdapter.Factory {
    final Executor callbackExecutor;

    ExecutorCallAdapterFactory(Executor callbackExecutor) {
        this.callbackExecutor = callbackExecutor;
    }

  @Override
  public CallAdapter<?, ?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) {
    if (getRawType(returnType) != Call.class) {
      return null;
    }
    final Type responseType = Utils.getCallResponseType(returnType);
    return new CallAdapter<Object, Call<?>>() {
      @Override public Type responseType() {
        return responseType;
      }

      @Override public Call<Object> adapt(Call<Object> call) {
        return new ExecutorCallbackCall<>(callbackExecutor, call);
      }
    };
  }

  static final class ExecutorCallbackCall<T> implements Call<T> {
    final Executor callbackExecutor;
    final Call<T> delegate;

    ExecutorCallbackCall(Executor callbackExecutor, Call<T> delegate) {
      this.callbackExecutor = callbackExecutor;
      this.delegate = delegate;
    }

    @Override public void enqueue(final Callback<T> callback) {
      checkNotNull(callback, "callback == null");

      delegate.enqueue(new Callback<T>() {
        @Override public void onResponse(Call<T> call, final Response<T> response) {
          callbackExecutor.execute(new Runnable() {
            @Override public void run() {
              if (delegate.isCanceled()) {
                // Emulate OkHttp's behavior of throwing/delivering an IOException on cancellation.
                callback.onFailure(ExecutorCallbackCall.this, new IOException("Canceled"));
              } else {
                callback.onResponse(ExecutorCallbackCall.this, response);
              }
            }
          });
        }

        @Override public void onFailure(Call<T> call, final Throwable t) {
          callbackExecutor.execute(new Runnable() {
            @Override public void run() {
              callback.onFailure(ExecutorCallbackCall.this, t);
            }
          });
        }
      });
    }

    @Override public boolean isExecuted() {
      return delegate.isExecuted();
    }

    @Override public Response<T> execute() throws IOException {
      return delegate.execute();
    }

    @Override public void cancel() {
      delegate.cancel();
    }

    @Override public boolean isCanceled() {
      return delegate.isCanceled();
    }

    @SuppressWarnings("CloneDoesntCallSuperClone") // Performing deep clone.
    @Override public Call<T> clone() {
      return new ExecutorCallbackCall<>(callbackExecutor, delegate.clone());
    }

    @Override public Request request() {
      return delegate.request();
    }
  }
}

可以看到,对于DefaultCallAdapterFactory,其CallAdapter.adapt()直接返回了Call,而ExecutorCallAdapterFactory的 CallAdapter.adapt()返回的是ExecutorCallbackCall,二者的区别在于,在执行异步调用时,回调在哪里执行。前者的异步回调和调用者在同一个线程,而后者异步回调执行在执行的Exctor的线程里。同是,我们也可以看到,无论采用哪种方式,请求的发起都是通过OkHttpCall进行的。

这里声明一点,对于Android平台,永远返回的是ExecutorCallAdapterFactory,而回调的Excutor是MainThreadExecutor,通过分析可以知道,在Android里,异步回调永远在Main线程中执行,这和Android的单线程模型相吻合。

使用Call对象发送同步或者异步Http请求

通过以上的分析,不论哪种Platform,请求的最终发起都是通过OkHttpCall进行的。实际上,同步请求通过OKHttpCall的excute方法执行,异步请求通过OkHttpCall的enqueue方法执行。下面分别进行分析。

同步请求

 @Override
public Response<T> execute() throws IOException {
    okhttp3.Call call;

    synchronized (this) {
        if (executed) throw new IllegalStateException("Already executed.");
        executed = true;

        if (creationFailure != null) {
            if (creationFailure instanceof IOException) {
                throw (IOException) creationFailure;
            } else {
                throw (RuntimeException) creationFailure;
            }
        }

        call = rawCall;
        if (call == null) {
            try {
                call = rawCall = createRawCall();
            } catch (IOException | RuntimeException e) {
                creationFailure = e;
                throw e;
            }
        }
    }

    if (canceled) {
        call.cancel();
    }

    return parseResponse(call.execute());
}

发起请求之前,首先通过

private okhttp3.Call createRawCall() throws IOException {
    Request request = serviceMethod.toRequest(args);
    okhttp3.Call call = serviceMethod.callFactory.newCall(request);
    if (call == null) {
        throw new NullPointerException("Call.Factory returned null.");
    }
    return call;
}

创建一个OkHttp Call对象,最终通过call.excute()发起同步请求,最后通过 parseResponse对获得的Response对象进行解析。

异步请求

 @Override
public void enqueue(final Callback<T> callback) {
    checkNotNull(callback, "callback == null");

    okhttp3.Call call;
    Throwable failure;

    synchronized (this) {
        if (executed) throw new IllegalStateException("Already executed.");
        executed = true;

        call = rawCall;
        failure = creationFailure;
        if (call == null && failure == null) {
            try {
                call = rawCall = createRawCall();
            } catch (Throwable t) {
                failure = creationFailure = t;
            }
        }
    }

    if (failure != null) {
        callback.onFailure(this, failure);
        return;
    }

    if (canceled) {
        call.cancel();
    }

    call.enqueue(new okhttp3.Callback() {
        @Override
        public void onResponse(okhttp3.Call call, okhttp3.Response rawResponse)
                throws IOException {
            Response<T> response;
            try {
                response = parseResponse(rawResponse);
            } catch (Throwable e) {
                callFailure(e);
                return;
            }
            callSuccess(response);
        }

        @Override
        public void onFailure(okhttp3.Call call, IOException e) {
            callFailure(e);
        }

        private void callFailure(Throwable e) {
            try {
                callback.onFailure(OkHttpCall.this, e);
            } catch (Throwable t) {
                t.printStackTrace();
            }
        }

        private void callSuccess(Response<T> response) {
            try {
                callback.onResponse(OkHttpCall.this, response);
            } catch (Throwable t) {
                t.printStackTrace();
            }
        }
    });
}

可以看到,异步请求和同步请求类似,最终是通过OkHttp Call.enqueue()发起的,最后通过parseResponse对结果进行解析。

读取请求的结果

通过上面的分析可以知道,OkHttpCall对Response的分析是通过 parseResponse()解析的。

 try {
        T body = serviceMethod.toResponse(catchingBody);
        return Response.success(body, rawResponse);
    } catch (RuntimeException e) {
        // If the underlying source threw an exception, propagate that rather than indicating it was
        // a runtime exception.
        catchingBody.throwIfCaught();
        throw e;
    }

通过上面的代码片段可以发现,其实是通过serviceMethod.toResponse(catchingBody)获取的。继续跟踪:

 /** Builds a method return value from an HTTP response body. */
    R toResponse(ResponseBody body) throws IOException {
    return responseConverter.convert(body);
}

responseConverter又是什么东西呢?

答案在 serviceMethod.Build里:

 responseType = callAdapter.responseType();
  if (responseType == Response.class || responseType == okhttp3.Response.class) {
    throw methodError("'"
        + Utils.getRawType(responseType).getName()
        + "' is not a valid response body type. Did you mean ResponseBody?");
  }
  responseConverter = createResponseConverter();

继续跟下去:

private Converter<ResponseBody, T> createResponseConverter() {
  Annotation[] annotations = method.getAnnotations();
  try {
    return retrofit.responseBodyConverter(responseType, annotations);
  } catch (RuntimeException e) { // Wide exception range because factories are user code.
    throw methodError(e, "Unable to create converter for %s", responseType);
  }
}

最后我们在这里找到了答案:

 public <T> Converter<ResponseBody, T> responseBodyConverter(Type type, Annotation[] annotations) {
    return nextResponseBodyConverter(null, type, annotations);
}

/**
 * Returns a {@link Converter} for {@link ResponseBody} to {@code type} from the available
 * {@linkplain #converterFactories() factories} except {@code skipPast}.
 *
 * @throws IllegalArgumentException if no converter available for {@code type}.
 */
public <T> Converter<ResponseBody, T> nextResponseBodyConverter(
        @Nullable Converter.Factory skipPast, Type type, Annotation[] annotations) {
    checkNotNull(type, "type == null");
    checkNotNull(annotations, "annotations == null");

    int start = converterFactories.indexOf(skipPast) + 1;
    for (int i = start, count = converterFactories.size(); i < count; i++) {
        Converter<ResponseBody, ?> converter =
                converterFactories.get(i).responseBodyConverter(type, annotations, this);
        if (converter != null) {
            //noinspection unchecked
            return (Converter<ResponseBody, T>) converter;
        }
    }

    StringBuilder builder = new StringBuilder("Could not locate ResponseBody converter for ")
            .append(type)
            .append(".\n");
    if (skipPast != null) {
        builder.append("  Skipped:");
        for (int i = 0; i < start; i++) {
            builder.append("\n   * ").append(converterFactories.get(i).getClass().getName());
        }
        builder.append('\n');
    }
    builder.append("  Tried:");
    for (int i = start, count = converterFactories.size(); i < count; i++) {
        builder.append("\n   * ").append(converterFactories.get(i).getClass().getName());
    }
    throw new IllegalArgumentException(builder.toString());
}

converterFactories又是在哪里实例化的呢?

 public Retrofit build() {
        if (baseUrl == null) {
            throw new IllegalStateException("Base URL required.");
        }

        okhttp3.Call.Factory callFactory = this.callFactory;
        if (callFactory == null) {
            callFactory = new OkHttpClient();
        }

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

        // Make a defensive copy of the adapters and add the default Call adapter.
        List<CallAdapter.Factory> adapterFactories = new ArrayList<>(this.adapterFactories);
        adapterFactories.add(platform.defaultCallAdapterFactory(callbackExecutor));

        // Make a defensive copy of the converters.
        List<Converter.Factory> converterFactories = new ArrayList<>(this.converterFactories);

        return new Retrofit(callFactory, baseUrl, converterFactories, adapterFactories,
                callbackExecutor, validateEagerly);
    }

而this.converterFactories又是在Build的addConverterFactory()方法里添加的,

public Builder addConverterFactory(Converter.Factory factory) {
        converterFactories.add(checkNotNull(factory, "factory == null"));
        return this;
}

Converter.Factory提供了我们对请求结果的序列化机制,retrofit实现里默认提供了七种常用的序列化机制,如Gson等。如果发现先有的Converter.Factory 不能满足我们的需求,那么我们可以实现Converter.Factory 接口,创建我们自己的序列化机制。

到此,Retrofit的源码完整解析就彻底完成了。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值