Kotlin 协程 异步 异步流
Posted 黄毛火烧雪下
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin 协程 异步 异步流相关的知识,希望对你有一定的参考价值。
runBlocking
因为launch只在CoroutineScope中声明
runBlocking 的名字意味着运行它的线程(在本例中是主线程)在调用期间被阻塞,直到runBlocking中所有的协程…完成他们的执行。您经常会在应用程序的顶层看到这样使用runBlocking,而在真正的代码中却很少这样使用,因为线程是昂贵的资源,阻塞它们的效率很低,而且通常是不可取的。
runBlocking
launch
delay(1000)
println("word!")
println("Helllo")
Helllo
word!
提取launch…转换成一个单独的函数
fun main(args: Array<String>)
runBlocking
launch doWorld()
println("Helllo")
suspend fun doWorld()
delay(1000)
println("word!")
Helllo
word!
任何挂起函数中使用coroutineScope
fun main(args: Array<String>)
runBlocking
doWorld()
suspend fun doWorld() = coroutineScope
launch
delay(1000L)
println("World!")
println("Hello")
Hello
World!
coroutineScope构建器可以执行多个并发操作
fun main(args: Array<String>)
runBlocking
doWorld()
println("Done")
suspend fun doWorld() = coroutineScope
launch
delay(2000L)
println("World 2")
launch
delay(1000L)
println("World 1")
println("Hello")
Hello
World 1
World 2
Don
等待子协程完成,然后打印“Done”字符串
runBlocking
val job = launch // launch a new coroutine and keep a reference to its Job
delay(1000L)
println("World!")
println("Hello")
job.join() // wait until child coroutine completes
println("Done")
Hello
World!
Done
组合挂起函数,等拿到每个条件之后,在得出结论
fun main() = runBlocking<Unit>
//sampleStart
val time = measureTimeMillis
println("The answer is $concurrentSum()")
println("Completed in $time ms")
//sampleEnd
suspend fun concurrentSum(): Int = coroutineScope
val one = async doSomethingUsefulOne()
val two = async doSomethingUsefulTwo()
one.await() + two.await()
suspend fun doSomethingUsefulOne(): Int
delay(1000L) // 假设我们在这里做了些有用的事
return 13
suspend fun doSomethingUsefulTwo(): Int
delay(1000L) // 假设我们在这里也做了些有用的事
return 29
The answer is 42
Completed in 1017 ms
异步流Flow倒计时
@RequiresApi(Build.VERSION_CODES.N)
fun main(args: Array<String>)
runBlocking
launch
val ret = countdown(60_000, 2_000) remianTime ->
println("剩余时间$remianTime")
.onStart
println("countdown start")
.onCompletion
println("countdown end")
.reduce acc, value ->
println("acc$acc value $value ")
println("coutdown acc ret = $ret")
fun <T> countdown(
duration: Long,
interval: Long,
onCountdown: suspend (Long) -> T
): Flow<T> = flow
(duration - interval downTo 0 step interval).forEach emit(it)
.onEach delay(interval)
.onStart emit(duration)
.map onCountdown(it)
.flowOn(Dispatchers.Default)
countdown start
剩余时间60000
剩余时间58000
acckotlin.Unit value kotlin.Unit
剩余时间56000
acckotlin.Unit value kotlin.Unit
剩余时间54000
........
acckotlin.Unit value kotlin.Unit
剩余时间2000
acckotlin.Unit value kotlin.Unit
剩余时间0
acckotlin.Unit value kotlin.Unit
countdown end
coutdown acc ret = kotlin.Unit
参考文章 :https://book.kotlincn.net/text/flow.html
Kotlin 异步 | Flow 应用场景及原理 https://juejin.cn/post/6989032238079803429
以上是关于Kotlin 协程 异步 异步流的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin 协程Flow 异步流 ② ( 使用 Flow 异步流持续获取不同返回值 | Flow 异步流获取返回值方式与其它方式对比 | 在 Android 中使用 Flow 异步流下载文件 )
Kotlin 协程Flow 异步流 ② ( 使用 Flow 异步流持续获取不同返回值 | Flow 异步流获取返回值方式与其它方式对比 | 在 Android 中使用 Flow 异步流下载文件 )
Kotlin 协程Flow 异步流 ④ ( 流的构建器函数 | flow 构建器函数 | flowOf 构建器函数 | asFlow 构建器函数 )