You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Kotlin suspend修饰的Retrofit接口方法作为参数传入泛型方法

解决方案

  • 利用Kotlin的挂起函数类型定义泛型方法的形参,即可接收任意suspend方法作为入参,具体实现如下:
  1. 先定义通用回调接口
interface NetworkListener<T> {
    fun onSuccess(data: T)
    fun onFail(error: Throwable)
}
  1. 实现IO调度执行的泛型方法
    这里指定入参request的类型为suspend () -> T,代表这是一个无入参、返回值为T的挂起函数:
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext

suspend fun <T> runNetworkRequest(
    request: suspend () -> T,
    listener: NetworkListener<T>
) {
    // 切IO线程执行网络请求
    val result = runCatching { 
        withContext(Dispatchers.IO) { request() } 
    }
    // 切主线程回调结果
    withContext(Dispatchers.Main) {
        result.onSuccess { listener.onSuccess(it) }
              .onFailure { listener.onFail(it) }
    }
}
  1. 传递patientLogin方法
    因为你的patientLogin需要传入LoginRequest参数,所以用Lambda包裹调用即可,不需要额外处理方法引用的传参问题:
// 假设你已经初始化了Retrofit接口实例 authApi
val loginRequest = LoginRequest(username = "xxx", password = "xxx")

// 调用泛型方法,传入请求和回调
runNetworkRequest(
    request = { authApi.patientLogin(loginRequest) },
    listener = object : NetworkListener<Response<BaseResponse<User>>> {
        override fun onSuccess(data: Response<BaseResponse<User>>) {
            // 处理请求成功逻辑,判断响应码、解析返回数据
        }

        override fun onFail(error: Throwable) {
            // 处理网络异常、请求失败逻辑
        }
    }
)
  • 补充说明:如果你的方法不需要传参,可以直接用方法引用的写法,比如runNetworkRequest(request = authApi::xxxMethod, listener = ...)。

内容的提问来源于stack exchange,提问作者Talha Akbar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 19:27:02