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 项目标准网络架构标配。

相关推荐
-SOLO-1 小时前
使用Perfetto debug trace查看超时slice
android
阿巴斯甜1 小时前
OkHttp
android
阿巴斯甜2 小时前
Flow
android
用户86022504674723 小时前
Claw 分析 Perfetto Trace
android
游戏开发爱好者84 小时前
使用Fiddler设置HTTPS抓包诊断Power Query网络问题
android·ios·小程序·https·uni-app·iphone·webview
阿巴斯甜5 小时前
Lifecycle
android
fengci.5 小时前
CTF+随机困难部分
android·开发语言·网络·安全·php
阿巴斯甜5 小时前
LiveData
android
OCN_Yang5 小时前
Android 开发:XML、Flutter、Compose 怎么选?
android