Android Retrofit 源码解析

这篇具有很好参考价值的文章主要介绍了Android Retrofit 源码解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在 Android 开发中,Retrofit 是一个非常流行的网络请求库。它是由 Square 开发的,用于简化 Android 应用程序与网络服务器之间的通信

Retrofit 主要用于处理 RESTful API 的网络请求。它通过将 HTTP 请求与 Java 接口方法进行映射,使得网络请求的编写变得简单和直观。使用 Retrofit,开发者可以定义一个描述网络请求的接口,然后通过注解将请求的URL、请求方法、请求参数等信息与接口方法绑定起来。Retrofit 会处理底层的网络请求和数据解析,开发者只需要关注业务逻辑的实现。


Retrofit 的使用:

        // retrofit 初始化
        retrofit = new Retrofit.Builder()
                .baseUrl("https://www.wanandroid.com/")
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create(new Gson()))
                .build();

        // 创建接口服务
        INetService iNetService = retrofit.create(INetService.class);

        // 进行网络请求
        iNetService.someThingCall().enqueue(new Callback<Bean>() {
            @Override
            public void onResponse(Call<Bean> call, Response<Bean> response) {
            }

            @Override
            public void onFailure(Call<Bean> call, Throwable t) { }
        });


// 服务接口
interface INetService {
    Call<Bean> someThingCall();
}

这就是 Retrofit 的一个常规使用,先初始化,接着创建接口服务,接着就可以进行网络请求了,可以说比 Okhttp 简洁非常多。关键就是 Retrofit.create() 这个方法,里面做了非常多的事


package retrofit2;

public final class Retrofit {

  public <T> T create(final Class<T> service) {
    validateServiceInterface(service); // 验证接口类
    return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] {service},
            new InvocationHandler() {
              @Override
              public Object invoke(Object proxy, Method method, Object[] args)
                  throws Throwable {
                // ....
                return platform.isDefaultMethod(method)
                    ? platform.invokeDefaultMethod(method, service, proxy, args)
                    : loadServiceMethod(method).invoke(args);
              }
            });
  }
}

可以看到,create 方法中使用了动态代理,返回的是 loadServiceMethod(method).invoke(args);

加载服务方法然后去执行,先看 loadServiceMethod:


  ServiceMethod<?> loadServiceMethod(Method method) {
    ServiceMethod<?> result = serviceMethodCache.get(method); // 先从缓存中取
    if (result != null) return result;

    synchronized (serviceMethodCache) {
      result = serviceMethodCache.get(method);
      if (result == null) {
        result = ServiceMethod.parseAnnotations(this, method);
        serviceMethodCache.put(method, result);
      }
    }
    return result;
  }

会先从缓存中取,若没有缓存则调用 ServiceMethod.parseAnnotations():


package retrofit2;

abstract class ServiceMethod<T> {

  static <T> ServiceMethod<T> parseAnnotations(Retrofit retrofit, Method method) {
    RequestFactory requestFactory = RequestFactory.parseAnnotations(retrofit, method);

    Type returnType = method.getGenericReturnType();
    // ... 对返回类型做判断

    return HttpServiceMethod.parseAnnotations(retrofit, method, requestFactory);
  }
}

这个静态方法主要是对返回类型做判断,收集请求相关的信息整理到 requestFactory 这个对象当中,再调用 HttpServiceMethod.parseAnnotations() :


package retrofit2;

abstract class HttpServiceMethod<ResponseT, ReturnT> extends ServiceMethod<ReturnT> {

  static <ResponseT, ReturnT> HttpServiceMethod<ResponseT, ReturnT> parseAnnotations(
      Retrofit retrofit, Method method, RequestFactory requestFactory) {
    boolean isKotlinSuspendFunction = requestFactory.isKotlinSuspendFunction;

    Annotation[] annotations = method.getAnnotations();
    Type adapterType;
    if (isKotlinSuspendFunction) {
      // Kotlin 协程相关
    } else {
      adapterType = method.getGenericReturnType();
    }

    // 从 retrofit 中获取请求适配器
    CallAdapter<ResponseT, ReturnT> callAdapter =
        createCallAdapter(retrofit, method, adapterType, annotations); 

    // 从 retrofit 中获取响应转换器
    Converter<ResponseBody, ResponseT> responseConverter =
        createResponseConverter(retrofit, method, responseType); 

    okhttp3.Call.Factory callFactory = retrofit.callFactory;
    if (!isKotlinSuspendFunction) {
      return new CallAdapted<>(requestFactory, callFactory, responseConverter, callAdapter);
    } else {
      // Kotlin 协程相关
    }
  }

}

最终,Retrofit.create() 方法中的 loadServiceMethod() 返回的是一个具有请求信息、okhttp 的请求工厂、响应转换器和请求适配器的 CallAdapted


接着,调用 loadServiceMethod().invoke():

package retrofit2;

abstract class HttpServiceMethod<ResponseT, ReturnT> extends ServiceMethod<ReturnT> {

  @Override
  final @Nullable ReturnT invoke(Object[] args) {
    // 创建能够进行网络请求的 Call
    Call<ResponseT> call = new OkHttpCall<>(requestFactory, args, callFactory, responseConverter);
    return adapt(call, args);
  }

}

此时,会将之前的所有请求相关的参数,条件都封装到具有网络请求功能的 OkHttpCall,然后和请求参数一起适配到之前的适配器当中。


最终,返回的 Call 是 DefaultCallAdapterFactory.ExecutorCallbackCall:

package retrofit2;

final class DefaultCallAdapterFactory extends CallAdapter.Factory {

  static final class ExecutorCallbackCall<T> implements Call<T> {
    final Executor callbackExecutor; // 这个是用来切换主线程的
    final Call<T> delegate; // 这个就是 OkHttpCall

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

    @Override
    public void enqueue(final Callback<T> callback) {  // 异步请求
      delegate.enqueue(new Callback<T>() {
            @Override
            public void onResponse(Call<T> call, final Response<T> response) {
              callbackExecutor.execute(() -> {
                    if (delegate.isCanceled()) {
                      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(() -> callback.onFailure(ExecutorCallbackCall.this, t));
            }
          });
    }

    @Override
    public Response<T> execute() throws IOException {  // 同步请求
      return delegate.execute();
    }

  }
}

总的来说,Retrofit是一个功能强大、易于使用的网络请求库,它简化了安卓应用程序与服务器之间的通信,提供了方便的接口定义和数据解析功能,是安卓开发中常用的网络请求工具之一。文章来源地址https://www.toymoban.com/news/detail-540117.html

到了这里,关于Android Retrofit 源码解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Android】OkHttp+Retrofit+Flow的简单使用

    实现一个简单的登录功能 引入依赖 我们现在有这样一个 Body 请求参数 当使用 post 请求之后,获取返回的数据 当允许登录的话,这个值就是 true 我们先创建两个数据Bean类 然后我们再创建一个密封类处理返回结果的分类 我们再创建一个Retrofit+OkHttp的单例类 好了,接下来再创

    2024年02月12日
    浏览(43)
  • Android OkHttp/Retrofit框架使用Interceptor 抓包/mock数据

    在Android业务开发中,抓包/mock数据一般有 两种方案 (该篇主要介绍第 二 种方案): 前提: 网络库使用的是okhttp或Retrofit。 这里就用到了okhttp框架的原理定义一个 MockDataInterceptor 【Mock数据拦截器】,并在创建Builder实例的时候直接使用 addIntercepter 【 应用拦截器 】添加 Moc

    2024年02月07日
    浏览(37)
  • Android 使用Retrofit+协程实现超简单大文件下载并回显进度条

    安卓自带的进度条弹窗过时了,这里简单创建一个进度条弹窗 在 drawable 文件夹创建 progress_dialog_bg_style.xml 一个圆角白色背景样式 创建 alert_dialog_download_progress.xml 布局 创建弹窗工具类,使用刚才创建好的布局 简单封装一个下载工具类 先定义一个下载参数实体 DownloadDTO 编写下

    2024年02月12日
    浏览(54)
  • Android笔记(十八):面向Compose组件结合Retrofit2和Rxjava3实现网络访问

    Square公司推出的Retrofit2库(https://square.github.io/retrofit/),改变了网络访问的方式。它实现了网络请求的封装。Retrofit库采用回调处理方式,使得通过接口提交请求和相应的参数的配置,就可以获得对应的响应,并可以将响应获得的数据解析成特定的数据格式,例如将JSON数据解

    2024年02月02日
    浏览(39)
  • Retrofit源码分析&实践(八)【Retrofit CallAdapter的引入】

    Retrofit源码分析实践系列文章目录 Retrofit源码分析实践(一)【从使用入手分析源码】 Retrofit源码分析实践(二)【Retrofit 免费的api测试工具引入】 Retrofit源码分析实践(三)【Retrofit 代码框架搭建】 Retrofit源码分析实践(四)【Retrofit 实现请求和返回】 Retrofit源码分析实践

    2024年02月02日
    浏览(78)
  • Retrofit源码分析&实践(七)【Retrofit ConvertFactory的功能实现】

    Retrofit源码分析实践系列文章目录 Retrofit源码分析实践(一)【从使用入手分析源码】 Retrofit源码分析实践(二)【Retrofit 免费的api测试工具引入】 Retrofit源码分析实践(三)【Retrofit 代码框架搭建】 Retrofit源码分析实践(四)【Retrofit 实现请求和返回】 Retrofit源码分析实践

    2024年02月02日
    浏览(31)
  • 大型Android项目架构:基于组件化+模块化+Kotlin+协程+Flow+Retrofit+Jetpack+MVVM架构实现WanAndroid客户端

    前言:苟有恒,何必三更眠五更起;最无益,莫过一日曝十日寒。 之前一直想写个 WanAndroid 项目来巩固自己对 Kotlin+Jetpack+协程 等知识的学习,但是一直没有时间。这里重新行动起来,从项目搭建到完成前前后后用了两个月时间,平常时间比较少,基本上都是只能利用零碎的

    2024年02月09日
    浏览(54)
  • 【面试 反思】Retrofit源码与设计 7 连问

    在实际项目中往往是使用 Retrofit 来做网络请求工作。 Retrofit 采用 RESTful 风格,本质上只是对 OkHttp 进行封装,今天我们根据几个问题来进一步学习一下 Retrofit 的源码与设计思想。 直接看一下官方介绍的使用方法。 可以简单的概括成三步: 构建 retrofit 实例。 构建 API 接口实

    2024年02月11日
    浏览(47)
  • Java反射机制,动态代理,hook以及在Retrofit源码中的应用

    1.反射的基础知识: Java的反射机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机

    2024年02月13日
    浏览(44)
  • 框架解读 | Retrofit设计剖析

    作者:Calculus_小王 Retrofit是一个类型安全的HTTP客户端,可以通过注解将HTTP API转换为Java接口,并使用动态代理,CallAdapter和Converter来发起请求和解析响应。 本文 着重于 Retrofit的架构设计,对于其 注解解析能力 上 不作详细阐述 本文基于 retrofit:2.6.2 本示例仅以最基础的retro

    2024年02月13日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包