首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在另一个withContext中调用(kotlin coroutine) withContext安全吗?

在另一个withContext中调用(kotlin coroutine) withContext安全吗?
EN

Stack Overflow用户
提问于 2021-06-30 18:02:07
回答 1查看 418关注 0票数 1

我有一个简单的代码片段:

代码语言:javascript
复制
fun setMapIcon(bitmapDescriptor: BitmapDescriptor?, 
               coordinateId:Long?, clickListener: (Double,Double) -> Unit ){
    
lifecycleScope.launchWhenStarted {
      
    withContext(Dispatchers.IO){
         //Do some heavy work that needs many variables
         withContext(Dispatchers.Main){ 
            //Publish variables
         }

         //Do more heavy work
         withContext(Dispatchers.Main){ 
            //Publish more variables
            //call `lambda` clickListener
         } 
      }  
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-02 05:43:35

如果您担心上面的代码会导致任何问题,那么请放心,语义是很好定义的,并且它会像预期的那样工作。至于你是否应该做这件事,developer.android.com有话要说。

代码语言:javascript
复制
suspend fun fetchDocs() {                      // Dispatchers.Main
    val result = get("developer.android.com")  // Dispatchers.Main
    show(result)                               // Dispatchers.Main
}

suspend fun get(url: String) =                 // Dispatchers.Main
    withContext(Dispatchers.IO) {              // Dispatchers.IO (main-safety block)
        /* perform network IO here */          // Dispatchers.IO (main-safety block)
    }                                          // Dispatchers.Main
}

与等效的基于回调的实现相比,withContext()不会增加额外的开销。此外,在某些情况下,可以在等效的基于回调的实现之外优化withContext()调用。例如,如果一个函数对一个网络进行了十次调用,您可以通过使用外部withContext()告诉Kotlin只切换一次线程。然后,即使网络库多次使用withContext(),它仍然停留在同一个dispatcher上,避免切换线程。

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

https://stackoverflow.com/questions/68199619

复制
相关文章

相似问题

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