我对何时使用暂停和何时不使用有疑问。我的APIRepo类具有这样的功能-
override suspend fun retrieveDataFromRemote(): MyResult {
if (utility.checkDeviceInternetConnection()) {
try {
val result = remoteInterface.getData().await()
return ...
} catch (t: Throwable) {
return ...
}
} else {
return ...
}
}
我的远程接口代码如下所示-
@GET("/data/mydata")
fun getData(): Deferred<Response<MyModel>>
您会看到我的RemoteInterface
没有suspend
关键字,并返回了Deferred
。这完全正常。但是,当我向suspend
添加getData()
关键字时,我没有得到API响应。为什么会这样呢?它与Deferred
有关系吗?
答案 0 :(得分:0)
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
}
}
答案 1 :(得分:0)
何时使用暂停,何时不使用?您可以参考suspend
从Retrofit 2.6.0或更高版本开始,它具有内置的挂起支持,请不要使用Deferred