如何将Kotlin suspend修饰的Retrofit接口方法作为参数传入泛型方法
解决方案
- 利用Kotlin的挂起函数类型定义泛型方法的形参,即可接收任意suspend方法作为入参,具体实现如下:
- 先定义通用回调接口
interface NetworkListener<T> { fun onSuccess(data: T) fun onFail(error: Throwable) }
- 实现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) } } }
- 传递
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
相关产品推荐
相关产品推荐

