day8 kotlin coroutine的 runBlocking, withContext

runBlocking

中文用户如我们? 直译一下就是,跑一个塞住

恩,三小?

他真正的意思是,执行一个程序码区块,但他的一个特点就是,他真的会塞住,有别於launch和async让程序码并联执行,这个方式开启的coroutine是为了让程序码串联执行


看看注解,他不应该被coroutine调用,这个设计适用在将一般function带入以suspend方式撰写的library, 使用在main functions 和测试 ,详情和使用方法会在後面的测试章节用到,这边就简单带过。

p.s.因为是新手向的,解释一下main function,他就是程序开始执行的一个入口,APP应用会有LAUNCH icon,但今天如果写server,程序会从main开始执行。详情自己查

withContext

withContext可以在scope里面切换Dispatcher,并在执行完成後自动切回原本的Dispatcher,再接着执行後面的代码

和launch和async不同的是,withContext是一个suspend function,作用是透过我们传入的Dispatcher切换thread,并且我们传入的context会继承原有的CoroutineContext,在lambda里面变成新的CoroutineContext


source code长这样

For example, if a function makes ten calls to a network, you can tell Kotlin to switch threads only once by using an outer withContext(). Then, even though the network library uses withContext() multiple times, it stays on the same dispatcher and avoids switching threads

至於文档这一段,我始终没怎麽看懂,我理解上是

withContext(Dispatcher.IO){
    repeat(10){dosomething()}
}

suspend fun doSomething (){
    withContext (Dispatcher.IO){
}
}

目前理解的意思是,如果有多次执行的Io任务,在外侧加上withContext,可以减少thread不断切换的成本,这是callback function办不到的,但我对这英文还要琢磨琢磨,如果有想法再回来更新
[文档](https://developer.android.com/kotlin/coroutines/coroutines-adv)

统整一下

launch async withContext() runBlocking
创建coroutine 创建coroutine 在coroutine里面切换Dispatcher 创建阻塞的coroutine
内部顺序执行 并发、在指定地方拿到回传 切换thread 测试
结束时不回传 结束时回传Deferred 结束时返回原本的Dispatcher 结束时不回传

<<:  [Day8] Storage

>>:  .NET Core第23天_ImageTagHelper的使用

Day29 Android - 简易内嵌网页(webview)

今天主要要来在app内简易的嵌入一个网页(webview),webview不包含网路浏览器的所有功能...

[DAY 26]随机组队功能

公会成员平均在线成员人数有90位,但实际在discord频道活跃人数不到20位 为了让非活跃在线人数...

Day 09 CSS <背景属性>

CSS背景属性 可以给页面元素添加背景样式 背景属性可设置背景颜色、背景图片、背景平舖、背景图片位置...

Veeam Backup专业级备份软件从入门到实战02

课程大纲: Veeam Backup & Replication V11新功能特性介绍 V...

[第十二天]从0开始的UnityAR手机游戏开发-如何在辨识图卡时拨放影片01

小试身手解答: 点击File→Save As... 跳出此视窗,将场景命名为ARVideo储存在此 ...