Retrofit

1、什么是 Retrofit?

答案

Retrofit 是 Square 开源的 Android 网络封装框架 ,是对 OkHttp 上层的封装。

注解方式定义网络接口,自动做请求封装、参数拼接、JSON 自动解析,配合协程、RxJava 使用,简化网络代码。

2、Retrofit 和 OkHttp 的关系

答案

  • OkHttp:真正底层做 TCP/HTTP 请求、Socket 通信、连接池、缓存、拦截器。
  • Retrofit :只是上层封装框架 ,不直接发网络请求,底层完全依赖 OkHttp。一句话:Retrofit 管语法和解析,OkHttp 管真正发请求。

3、Retrofit 核心原理

答案

  1. 编译期通过注解解析接口方法、请求方式、参数、地址;
  2. 运行时通过 动态代理 生成接口的代理对象;
  3. 把接口方法参数、注解,拼成 OkHttp 的 Request;
  4. 交给 OkHttp 执行网络请求;
  5. 拿到 Response 后,通过 转换器 自动解析成实体类。

核心三点:注解 + 动态代理 + 转换器

4、为什么要用 Retrofit,不用原生 OkHttp?

答案

  1. 接口用注解定义,不用手写拼接 Url、Header、参数;
  2. 自动 JSON 解析,不用手动 Gson 解析;
  3. 支持协程、RxJava,代码更简洁;
  4. 统一配置、全局 BaseUrl、超时、拦截器;
  5. 结构规范,适合大型项目架构分层。

5、Retrofit 常用注解分类

答案

  1. 请求方法注解GET、POST、PUT、DELETE、HEAD、PATCH
  2. 路径注解@Url、@Path 路径替换
  3. 参数注解@Query 拼接 url 参数@Field 表单参数@Body 请求体 JSON
  4. 请求头注解@Header、@Headers 静态 / 动态请求头
  5. 表单、文件上传@FormUrlEncoded、@Multipart、@Part、@PartMap

6、@Query 和 @Field 区别

答案

  • @Query :拼接在 URL 后面 问号参数,Get 请求常用。
  • @Field :放在 请求体表单 里,Post 表单提交,必须配合 @FormUrlEncoded。

7、@Body 和 @Field 区别

答案

  • @Body :传 JSON 对象,放在请求体,后端接收 JSON。
  • @Field :表单键值对,Content-Type 是 form 表单。

8、Retrofit 动态代理作用

答案

我们只写 接口 + 注解,不写实现类;

Retrofit 通过 动态代理 自动生成接口实现类,拦截方法调用,解析注解、组装请求,不用开发者手写实现逻辑。

9、Retrofit 转换器工厂是干嘛的

答案 把 OkHttp 原始 Response 自动转成实体类。常用:

  • GsonConverterFactory 自动 JSON 解析
  • ScalarsConverterFactory 支持 String 原始返回
  • RxJava3CallAdapterFactory 适配 RxJava
  • KotlinCoroutine 适配协程

10、CallAdapterFactory 作用

答案

用来适配返回值类型:

  • 默认返回 Call
  • 用 RxJava 适配器可以返回 Observable、Single
  • 协程适配可以直接返回 suspend 函数、Flow

11、Retrofit 中 BaseUrl 注意事项

答案

  1. BaseUrl 必须以 / 结尾;
  2. 接口里 @Url 如果写全路径,会覆盖 BaseUrl;
  3. 多 BaseUrl 可以用 @Url 动态传全地址 或者自定义域名解析器。

12、Retrofit 怎么配置全局拦截器

答案

Retrofit 不能直接加拦截器,要先配置 OkHttpClient,在 OkHttp 里添加拦截器,再把 OkHttp 注入 Retrofit。

日志、公共请求头、Token 刷新都写在 OkHttp 拦截器里。

13、Retrofit 支持协程原理

答案

  1. 接口方法加 suspend 挂起函数;
  2. Retrofit 内部适配协程 CallAdapter;
  3. 网络请求在子线程执行,完成后自动切回主线程;
  4. 可以直接用 try-catch 处理异常,不用回调。

14、Retrofit 能不能适配 LiveData、Flow

答案

可以。

通过自定义 CallAdapter,把返回值包装成 LiveData、Flow,接口直接返回 Flow,配合 ViewModel 直接观察 UI 状态。

15、Retrofit 优缺点

答案优点:

  1. 注解化接口,代码简洁规范;
  2. 自动 JSON 解析;
  3. 完美适配协程、RxJava;
  4. 底层 OkHttp 拥有连接池、缓存、超时、拦截器能力;
  5. 易于全局统一配置、分层架构。

缺点:

  1. 注解多,新手难懂;

  2. 编译期注解会稍微增加编译时间;

  3. 底层依赖 OkHttp,不能脱离 OkHttp 单独使用。

16、Retrofit 中同步和异步请求

答案

  • 普通 Call 对象:execute () 同步、enqueue () 异步
  • 协程 suspend 方法:直接调用就是异步,内部自动切子线程。

17、Retrofit 怎么实现文件上传

答案

  1. 加注解 @Multipart
  2. 用 @Part 传 File / RequestBody
  3. 支持多文件同时上传底层还是 OkHttp 做 Multipart 表单封装。

18、Retrofit 怎么统一处理网络异常

答案

  1. 封装 BaseRepository 统一 try-catch 协程异常;
  2. 自定义拦截器统一处理 401 Token 过期、错误码;
  3. 统一封装返回实体类,解析业务错误码。

19、Retrofit 动态替换 BaseUrl 怎么做

答案

三种方式:

  1. 接口方法用 @Url 传入完整域名地址;
  2. 自定义 Retrofit 域名解析器拦截域名;
  3. 多个 Retrofit 实例分别对应不同 BaseUrl。

20、面试一句话总结(必背)

Retrofit 是基于 OkHttp 上层的注解式网络框架,依靠注解 + 动态代理自动生成网络请求,通过转换器自动解析 JSON,适配器适配协程和 RxJava;本身不发网络请求,只做请求封装和适配,全局依赖 OkHttp 的连接池、拦截器、超时配置,是 Android 项目标准网络架构标配。

相关推荐
三少爷的鞋17 分钟前
现代 Android 架构指南:不要再主动设计 Callback 接口
android
TimeFine6 小时前
AI 编码工作流的设计
android·ai编程
骑着蜗牛撵大象3277 小时前
C++20 协程 × 屏障:手写一个 co_await 版 Barrier,让等待不再钉死线程
android·c++20·协程·并发编程·co_await·屏障同步
山东孙燕姿8 小时前
设备台账重构:从一张表到三层模型
android·java·网络·低代码·重构·rxjava
蒸鱼Yuzheng9 小时前
移动端 CPU 调度分析:线程亲和性、大小核迁移与卡顿
android·perfetto·性能分析·线程优化·cpu调度
booboosui10 小时前
安卓唤醒词:12 维 MFCC 加 DTW,阈值 1.8
android
传奇开心果10 小时前
Compose Multiplatform 共享边界实战:架构契约、互操作同步与可回退设计
android·kotlin
事圆则缓10 小时前
从开机到首帧:Android 系统与应用启动流程源码分析
android
AI吃大瓜10 小时前
指针压力表读数4:Android实现指针压力表读数(可实时检测)
android·指针读数·指针压力表·压力表·压力表读数
fengci.10 小时前
CTF2刷题记录(困难部分)
android·开发语言·前端·学习·php