请描述在 Android 开发环境中,如何将 Retrofit 网络库与 Kotlin 协程结合使用?
考察说明
考查候选人是否掌握 Retrofit 的协程支持机制及实际使用方法。
回答思路
- 【回答框架 1】Retrofit 从 2.6.0 版本开始原生支持 Kotlin 协程,只需在接口方法中声明 suspend 函数即可。当调用该接口时,Retrofit 会自动在后台线程执行网络请求,并在请求完成时恢复协程,不需要额外的 adapter。
- 【回答框架 2】使用时,首先在 Retrofit.Builder 中正确配置 baseUrl 和 Gson 或 Moshi 等转换器,然后定义接口,例如:@GET("users/{id}") suspend fun getUser(@Path("id") id: String): User。注意返回类型不能是 Call,而应直接是数据模型或 Response<T>。
- 【回答框架 3】在 ViewModel 或协程作用域中调用该接口,通常使用 viewModelScope.launch 启动协程,并使用 try-catch 或 flow 操作符处理成功与失败结果。此外,使用 withContext(Dispatchers.IO) 可以确保网络操作在合适的调度器上执行,尽管 Retrofit 内部已经处理了线程切换,但最佳实践是保持主线程安全。
- 【回答框架 4】对于错误处理,建议使用 sealed class 封装网络状态,或者使用 Result 类型。同时,可以利用协程的取消机制,在界面销毁时自动取消请求,避免内存泄漏。
- 【回答框架 5】对于需要并发请求或顺序依赖的场景,可以使用 async/await 或组合挂起函数,简化异步流程。注意不要在主线程做耗时操作,确保挂起函数不阻塞主线程。
- 【关键点 1】Retrofit 2.6.0+ 原生支持 suspend 函数,无需额外 adapter。
- 【关键点 2】接口方法返回类型不能是 Call,需要是数据模型或 Response<T>。
- 【关键点 3】在 viewModelScope.launch 中调用挂起函数,结合 try-catch 处理异常。
- 【关键点 4】利用协程取消机制自动取消请求,防止内存泄漏。
- 【关键点 5】可结合 withContext(Dispatchers.IO) 或直接使用挂起函数进行线程切换。
- 【易错点 1】误用 Call 类型导致编译错误,需要改为 suspend 函数。
- 【易错点 2】忘记处理异常,可能导致应用崩溃,需使用 try-catch 或封装错误状态。
- 【易错点 3】在非主线程中直接更新 UI,应确保协程上下文正确,通过 viewModelScope 或 Main dispatcher 保证主线程安全。