首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实现Kotlin协程的并发性?

如何实现Kotlin协程的并发性?
EN

Stack Overflow用户
提问于 2019-07-06 08:07:52
回答 1查看 124关注 0票数 0

我有一个轮播列表,并运行每个轮播,基于轮播query,我做了fetchAssets()和fetchAssets()是Kotlin挂起的函数,但问题是当前一个函数完成时,每个函数都被调用,我想实现并发吗?

代码语言:javascript
复制
 uiScope.launch {
 carousels.mapIndexed { index, carousel ->
when (val assetsResult = assetRepository.fetchAssets(carousel.query)) {
  is Response.Success<List<Asset>> -> {
    if (assetsResult.data.isNotEmpty()) {
      val contentRow = ContentRow(assetsResult.data)
      contentRows.add(contentRow)
      contentRowsmutableData.postValue(contentRows)
    }
  }
  is Response.Failure -> {
  }
}
}
}
代码语言:javascript
复制
override suspend fun fetchAssets(query: String): Response<List<Asset>> {

  return suspendCoroutine { cont ->doHttp(assetsEndpoint, JsonHttpCall("GET"),
        object : JsonReaderResponseHandler() {
          override fun onSuccess(jsonReader: JsonReader) {
              val apiAsset = ApiAssetList(jsonReader)
              cont.resume(Response.Success(apiAsset.items))
          }

          override fun onError(error: Error) {
            cont.resume(Response.Failure("errorMessage"))
          }
        })
  }
}```
EN

回答 1

Stack Overflow用户

发布于 2019-07-06 08:25:48

您必须将挂起函数包装在async块中,然后等待所有异步操作完成:

代码语言:javascript
复制
uiScope.launch {
    val asyncList = carousels.map { carousel ->
        async { assetRepository.fetchAssets(carousel.query) }
    }
    val results = asyncList.awaitAll()
    results.forEach { result ->
        when (result) {
            is Response.Success -> TODO()
            is Response.Failure -> TODO()
        }
    }
}
suspend fun fetchAssets(query: String): Response<List<Asset>>

编辑:如果您希望在每个操作完成时更新UI,则需要按如下方式进行更改:

代码语言:javascript
复制
carousels.forEach { carousel ->
    uiScope.launch {
        val result = fetchAssets(carousel.query)
        when (result) {
            is Response.Success -> {
                if (result.data.isNotEmpty()) {
                    val contentRow = ContentRow(result.data)
                    contentRows.add(contentRow)
                    contentRowsmutableData.postValue(contentRows)
                }
            }
            is Response.Failure -> TODO()
        }
    }
}

检查this与协程的并发性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56910294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档