我有一个关于何时使用暂停和何时不使用的问题。我的APIRepo类具有这样的功能-
override suspend fun retrieveDataFromRemote(): MyResult {
if (utility.checkDeviceInternetConnection()) {
try {
val result = remoteInterface.getData().await()
return ...
} catch (t: Throwable) {
return ...
}
} else {
return ...
}
}
我的远程接口(interface)代码看起来像这样-
@GET("/data/mydata")
fun getData(): Deferred<Response<MyModel>>
如您所见,我的
RemoteInterface
没有suspend
关键字,并返回了Deferred
。这完全正常。但是,当我将suspend
关键字添加到getData()
时,我没有得到API响应。为什么会这样呢?它和Deferred
有关吗? 最佳答案
Retrofit 2.6.0或更高版本具有内置的suspend
支持。
可能您正在使用Kotlin Coroutine Adapter
。该库依靠反射来检测返回类型是否为Deffered
。参见here。
这是使用Retrofit 2.6.0的示例:
interface RemoteInterface{
@GET("/data/mydata")
suspend fun getData(): MyModel
}
在您的ViewModel中:
fun retrieveDataFromRemote() {
viewModelScope.launch {
val model = remoteInterface.getData()
// do something with model
}
}