使用Kotlin Flow+Retrofit实现顺序执行登录、更新接口请求示例
实现前提
我们先统一定义通用返回结构BaseResponse,包含业务成功状态判断逻辑,你可以根据实际业务规则调整判断条件:
// 通用接口返回基类 data class BaseResponse<T>( val code: Int, val message: String, val data: T? = null ) { // 自定义请求成功的判断规则,示例为code等于200即代表成功 val isSuccess: Boolean get() = code == 200 } // 你的两个suspend接口示例定义 suspend fun login(): BaseResponse<Unit> { // 此处为登录接口的实际请求逻辑 } suspend fun update(): BaseResponse<String> { // 此处为更新接口的实际请求逻辑 }
核心Flow实现代码
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.flow fun loginThenUpdate(): Flow<BaseResponse<*>> = flow { // 1. 调用login接口,等待返回结果 val loginResult = login() // 2. 校验login返回是否成功 if (!loginResult.isSuccess) { // 登录校验失败直接返回登录结果,不执行后续逻辑 emit(loginResult) return@flow } // 3. 校验通过后执行update接口 val updateResult = update() // 4. 发射update的返回结果 emit(updateResult) }.catch { e -> // 5. 捕获请求过程中抛出的异常,统一封装为错误返回,不会执行后续接口 emit(BaseResponse(code = -1, message = e.message ?: "请求发生未知错误")) }
调用示例
import kotlinx.coroutines.flow.collect import kotlinx.coroutines.runBlocking fun main() = runBlocking { loginThenUpdate().collect { result -> // 最终拿到的结果:要么是登录错误/异常,要么是update接口的返回 if (result.isSuccess) { println("请求成功,数据:${result.data}") } else { println("请求失败,原因:${result.message}") } } }
逻辑说明
- 完全符合需求的执行顺序:登录请求完成后才会走校验,校验通过才会执行更新接口
- 登录校验失败、登录过程抛异常都会直接返回错误,不会触发更新接口的调用
- 整个流为冷流,只有调用
collect的时候才会真正发起接口请求 - 所有运行异常都会被
catch操作符捕获,不会导致程序崩溃
内容的提问来源于stack exchange,提问作者Mahmoud Ayman
相关产品推荐
相关产品推荐

