在 Android 开发中,如何将 OkHttp 与 Kotlin 协程结合使用?请说明其实现方式和注意事项。
考察说明
考查候选人对 OkHttp 网络请求与 Kotlin 协程的集成方式及异步处理的理解。
回答思路
- 【回答框架 1】在 Android 中使用 OkHttp 与协程结合,常见方式包括:使用 suspendCancellableCoroutine 将 OkHttp 的异步回调包装为挂起函数,或者使用 OkHttp 的 kotlin 扩展库(如 okhttp-coroutines)。包装时需要在回调中 resume 结果或异常,并处理协程取消。
- 【回答框架 2】具体实现:创建 suspend 函数,内部调用 OkHttp 的 enqueue 方法,在 onResponse 中 resume 响应,在 onFailure 中 resume 异常,并在协程取消时取消请求,例如通过 invokeOnCancellation 取消 call。
- 【回答框架 3】需注意 OkHttp 本身就是异步的,协程只是调整了线程调度和代码风格,不改变底层网络机制。默认回调运行在子线程,若需切回主线程可结合 Dispatchers.Main。
- 【关键点 1】使用 suspendCancellableCoroutine 包装 OkHttp 异步回调,实现挂起函数。
- 【关键点 2】协程取消时需取消 OkHttp 请求,避免资源浪费。
- 【关键点 3】网络请求仍在 OkHttp 的线程池中执行,协程仅控制挂起与恢复。
- 【关键点 4】注意线程切换,更新 UI 时需回到主线程。
- 【易错点 1】忘记处理协程取消导致请求继续执行或回调泄漏。
- 【易错点 2】在回调中直接 resume 可能因重复调用而崩溃。
- 【易错点 3】混淆 OkHttp 的线程模型与协程调度器,导致线程阻塞。