51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

好未来APP的直播课功能需要实时传输视频流和互动消息,请说明如何设计网络请求方案(如Retrofit、OkHttp配置),并优化缓存策略(内存+磁盘)。

好未来Android难度:中等

答案

1) 【一句话结论】采用Retrofit+OkHttp实现网络请求,通过OkHttp配置内存(LruCache)+磁盘(DiskLruCache)缓存,结合拦截器处理请求头与响应,针对视频流(长生命周期磁盘缓存)和消息流(短生命周期内存缓存)设计差异化策略,满足实时传输需求。

2) 【原理/概念讲解】
老师口吻:首先讲Retrofit——它是Android网络请求的“模板化框架”,通过接口定义请求方法(如@GET、@POST),自动转换数据(Gson/Moshi),支持RxJava处理异步,让代码更简洁。然后讲OkHttp——它是底层HTTP客户端,负责连接管理、请求发送/响应接收,核心能力是缓存机制:

  • 内存缓存(LruCache):基于“最近最少使用”算法,缓存最近访问的热点数据(如用户信息、课程列表),访问速度快(直接从内存读取);
  • 磁盘缓存(DiskLruCache):持久化存储大文件(如视频流片段),支持多版本更新(通过版本号区分旧数据)。
    类比:Retrofit像“网络请求的模板工厂”,你定义接口方法,它自动生成请求;OkHttp像“网络请求的执行器”,负责实际发送请求、接收响应、处理缓存。

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) 【追问清单】

  • 问题1:网络抖动时如何处理?
    回答要点:使用OkHttp的重试机制(设置最大重试次数、延迟时间),结合Retrofit的RxJava重试操作符(如onErrorResumeNext),提升请求成功率。
  • 问题2:缓存更新策略是什么?
    回答要点:磁盘缓存使用版本号(如V1.0),当服务器更新数据时,返回新版本号,客户端根据版本号判断是否更新;内存缓存使用LRU算法,定期清理过期数据。
  • 问题3:视频流和消息流的缓存策略差异?
    回答要点:视频流(长生命周期)用DiskLruCache,消息流(短生命周期)用内存缓存(LruCache),避免消息流占用过多磁盘空间。
  • 问题4:如何处理缓存击穿问题?
    回答要点:对热点数据(如热门课程信息)设置分布式锁或限流,避免缓存穿透。
  • 问题5:如果网络环境不稳定,如何优化?
    回答要点:使用OkHttp的连接池(保持连接复用),配合Retrofit的连接超时设置(如连接超时5秒,读取超时10秒),提升请求成功率。

7) 【常见坑/雷区】

  • 缓存配置错误:未设置缓存目录或缓存大小,导致缓存无法使用;或缓存大小过大,占用过多存储空间。
  • 拦截器使用不当:拦截器中修改请求头或响应时,未正确处理线程安全,导致请求失败。
  • 未区分数据类型缓存策略:所有数据都使用相同缓存策略,导致热点数据缓存不足,非热点数据缓存过多。
  • 视频流缓存未分片:直接缓存整个视频流,导致内存占用过高,应分片缓存(如每1分钟一个片段)。
  • 未处理缓存更新冲突:当多个客户端同时更新缓存时,未考虑并发问题,导致数据不一致。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1