
1) 【一句话结论】采用Retrofit+OkHttp实现网络请求,通过OkHttp配置内存(LruCache)+磁盘(DiskLruCache)缓存,结合拦截器处理请求头与响应,针对视频流(长生命周期磁盘缓存)和消息流(短生命周期内存缓存)设计差异化策略,满足实时传输需求。
2) 【原理/概念讲解】
老师口吻:首先讲Retrofit——它是Android网络请求的“模板化框架”,通过接口定义请求方法(如@GET、@POST),自动转换数据(Gson/Moshi),支持RxJava处理异步,让代码更简洁。然后讲OkHttp——它是底层HTTP客户端,负责连接管理、请求发送/响应接收,核心能力是缓存机制:
3) 【对比与适用场景】
| 组件/方案 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| Retrofit | 基于注解的HTTP客户端框架 | 自动请求/响应转换,接口定义请求,支持拦截器 | 需要结构化网络请求,团队已有Retrofit经验 | 需学习注解/接口定义,配置相对灵活 |
| OkHttp | 高性能HTTP客户端 | 支持连接池、缓存、代理、重试 | 对性能要求高,需自定义请求/响应处理 | 需手动管理请求/响应,配置复杂度较高 |
| 缓存策略 | ||||
| 内存缓存(LruCache) | 基于LRU算法的内存缓存 | 快速访问,适合热点数据 | 用户信息、课程列表等 | 配置最大内存大小(公式:maxMemory/8) |
| 磁盘缓存(DiskLruCache) | 持久化磁盘缓存 | 支持大文件,多版本更新 | 视频流片段、图片资源 | 配置缓存目录、大小,支持版本号更新 |
4) 【示例】
Retrofit+OkHttp配置与请求示例(伪代码):
// 1. 配置OkHttp(缓存)
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.cache(new Cache(getCacheDir(), 10 * 1024 * 1024)) // 磁盘缓存10MB
.build();
// 2. 创建Retrofit实例
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.haofutui.com/")
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
// 3. 定义接口(直播流+消息)
public interface LiveService {
@GET("live/stream")
Call<LiveStreamResponse> getLiveStream(@Query("courseId") String courseId); // 视频流请求
@POST("messages/send")
Call<MessageResponse> sendMessage(@Body MessageRequest message); // 消息流请求
}
// 4. 调用示例
LiveService service = retrofit.create(LiveService.class);
service.getLiveStream("course123").enqueue(new Callback<LiveStreamResponse>() {
@Override
public void onResponse(Call<LiveStreamResponse> call, Response<LiveStreamResponse> response) {
// 处理视频流响应(如解析视频片段)
}
@Override
public void onFailure(Call<LiveStreamResponse> call, Throwable t) {
// 错误处理
}
});
OkHttp缓存配置说明:Cache对象指定缓存目录(getCacheDir())和最大缓存大小(10MB),适合存储视频流片段(大文件)或图片资源。
5) 【面试口播版答案】
“面试官您好,针对好未来APP的直播课功能,我设计的网络请求方案是采用Retrofit+OkHttp的组合。首先,Retrofit通过接口定义请求方法(比如获取直播流和发送消息),自动处理请求/响应转换,支持RxJava处理异步,提升代码可读性。然后配置OkHttp的缓存机制,内存缓存用LruCache(缓存最近访问的热点数据,如用户信息),磁盘缓存用DiskLruCache(缓存视频流片段,支持大文件存储),这样既能快速访问常用数据,又能持久化存储视频流,减少重复请求。针对直播课的实时性需求,消息流(如弹幕)采用短生命周期缓存(比如5分钟),视频流采用长生命周期缓存(比如1小时),避免缓存占用过多资源。同时,通过OkHttp的拦截器处理请求头(比如添加token、设备信息),响应处理(比如错误码处理),确保请求的可靠性和安全性。总结来说,这个方案结合了框架的高效性和缓存的高性能,满足直播课实时传输视频流和互动消息的需求。”
6) 【追问清单】
onErrorResumeNext),提升请求成功率。7) 【常见坑/雷区】