在上一篇文章中,我们详细分析了 Retrofit 中的注解解析和动态代理实现,本篇文章将继续深入研究 Retrofit 的核心源码,重点分析 Retrofit 如何进行网络请求和响应处理。

网络请求

在使用 Retrofit 发起网络请求时,我们可以通过定义一个接口并使用 Retrofit 的注解来描述这个接口中的请求,Retrofit 会自动生成一个实现该接口的代理对象。当我们调用这个代理对象的方法时,Retrofit 会根据注解的描述构建一个 Request 对象,并使用 OkHttp 将这个 Request 发送出去。

在 Retrofit 中,我们可以通过 Retrofit#execute 或 Retrofit#enqueue 方法来发送请求。这两个方法的区别在于,execute 方法会阻塞当前线程直到请求完成,而 enqueue 方法会将请求加入到 OkHttp 的请求队列中,并在请求完成时通过回调通知我们。

我们先来看一下 execute 方法的实现:

public T execute(Call call) throws IOException {

Utils.validateServiceInterface(call.request().tag(), call.request().url().toString());

return (T) callAdapter(call, call.request().tag()).adapt(call).execute();

}

在这个方法中,首先会对接口进行校验,确保这个接口是有效的。然后我们会根据请求的 Tag 和 URL 来获取适配器callAdapter,并使用适配器来执行请求。

适配器的作用是将请求的参数适配成 OkHttp 能够识别的形式,并将 OkHttp 的响应适配成我们需要的形式。Retrofit 提供了一系列的适配器,包括 Call 适配器、RxJava 适配器、CompletableFuture 适配器等。

我们来看一下 callAdapter 方法的实现:

private CallAdapter callAdapter(Call call, Object tag) {

Type responseType = call.request().method().equals("HEAD")

? Void.class

: getParameterUpperBound(0, (ParameterizedType) call.request().tag());

return callAdapter(tag, responseType);

}

在这个方法中,我们首先根据请求的方法来判断响应的类型,如果是 HEAD 方法,那么响应的类型就是 Void;否则我们会通过反射来获取请求的响应类型,并使用这个响应类型来获取适配器。

获取适配器的方法是 callAdapter:

public CallAdapter callAdapter(Object tag, Type returnType) {

// ...

for (CallAdapter.Factory factory : adapterFactories) {

CallAdapter adapter = factory.get(returnType, annotations, this);

if (adapter != null) {

return (CallAdapter) adapter;

}

}

// ...

}

在这个方法中,我们会遍历所有的适配器工厂ÿ

相关链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: