好主意还是不好:使用协程进行回应Kotlin

时间:2019-04-08 15:26:46

标签: android kotlin coroutine

我想问一个好的开发人员。也许任何人都可以更好地解释。在网络的某个地方,我发现很少有作者使用协程代替例如asynctasks。只是想提高自己。这是我使用的一小部分代码。只想知道-是好是坏。如果没有-如何使其变得更好,或者最终我会以错误的方式使用它。

 fun demoCall(callback: OnResponse) {
       CoroutineScope(Dispatchers.Main).launch {
          val result = withContext(Dispatchers.IO) {
             Api.getResponse("GET", ApiConstants.test_endpoint)//networkOnMainThread exception if i will not use withContext
          }
          callback?.onResponse(result))
       }
  }

此示例为work。但是我不确定它的用法是否正确。 如果回到过去,

  

getResponse

位于asyncTask中。呼叫与匿名回叫相同。 如果使用这种方式很好,看来我可以使用该部分而无需回调? 就是这样

fun demoCall() {
 CoroutineScope(Dispatchers.Main).launch {
    val result = withContext(Dispatchers.IO) {
       Api.getResponse("GET", ApiConstants.test_endpoint)
    }
    //do anything with result
    //populate views , make new response etc.. 
}

如果有任何话告诉我,会很高兴-可以还是不可以:)问候

1 个答案:

答案 0 :(得分:1)

我更喜欢使用suspend关键字在调用者的视图中将异步调用视为同步。

例如,

suspend fun demoCall(): String {
    return withContext(Dispatchers.IO) {
        Api.getResponse("GET", ApiConstants.test_endpoint) // let's assume it would return string
    }
}

呼叫者可以使用它

CoroutineScope(Dispatchers.Main).launch {
    val result = demoCall() //this is async task actually, but it seems like synchronous call here.
    //todo something with result
}