有关暂停和推迟的概念性问题

时间:2019-09-11 04:21:38

标签: android kotlin kotlin-coroutines

我对何时使用暂停和何时不使用有疑问。我的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有关系吗?

2 个答案:

答案 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