我有一个关于何时使用暂停和何时不使用的问题。我的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
  }
}

07-27 17:32