kotlin: flow: 用flowon指定上游的线程池
一,代码:
//处理按钮点击事件
binding.button1.setOnClickListener {
runBlocking {
val flow = flow {
//logX("Start")
emit(1)
logX("Emit: 1")
emit(2)
logX("Emit: 2")
emit(3)
logX("Emit: 3")
}
//用flowOn指定上游的线程
flow.filter {
logX("Filter: $it")
it > 2
}
.flowOn(Dispatchers.IO) // 注意这里
.collect {
logX("Collect $it")
}
}
}
//处理按钮点击事件
binding.button2.setOnClickListener {
runBlocking {
val flow = flow {
//logX("Start")
emit(1)
logX("Emit: 1")
emit(2)
logX("Emit: 2")
emit(3)
logX("Emit: 3")
}
//用flowOn指定上游的线程
flow.flowOn(Dispatchers.IO) // 注意这里
.filter {
logX("Filter: $it")
it > 2
}
.collect {
logX("Collect $it")
}
}
}
当需要频繁切换工作的线程时,
对于耗时任务,我们需要线程池当中执行,
对于 UI 任务,我们需要在主线程执行。
flowOn可以用来实现线程的切换
注意点: flowOn 的作用域仅限于上游,
所以它只会让 flow{} 当中的代码运行在 DefaultDispatcher 当中,剩下的代码则执行在 main 线程
二,运行结果:
第一个按钮点击:
第二个按钮点击: