在上一篇博客 【Kotlin 协程】Flow 异步流 ⑤ 中 , 调用 Flow#flowOn 函数 , 可以 指定 Flow 流发射元素 的 协程 ; Flow#launchIn 函数返回值是 Job 对象 , 是 协程任务对象 , 可调用 Job#cancel 函数取消该协程任务 ; 2、Flow#launchIn 函数原型 Flow#launchIn 函数原型 : /** * 终...
1.可以使用flow构建函数构建一个Flow类型返回值的函数 2.flow{}构建体中可以调用挂起函数,即上流 3.上流使用emit函数发射值 4.下流使用collect函数收集值 //上流函数funsimpleFlow()= flow {for(iin1..3) { delay(100) emit(i) } }funmain(){ runBlocking {//下流接收数据simpleFlow().collect { value ...
launch { val intFlow = flow { (1..3).forEach { delay(1000) emit(it) } } intFlow.collect { println(it) } } delay(2500) job.cancelAndJoin() 每隔1000ms 生产一个元素,2500ms 以后协程被取消,因此最后一个元素生产前 Flow 就已经被取消,输出为: 1 ▶ 1000ms later 2 如此看来,想要取消...
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.cancel class MainActivity : AppCompatActivity() { private var mCountDown: CoroutineScope? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) loadData(...
在Flow 流构建器 中 , 每次 调用 FlowCollector#emit 发射元素时 , 都会执行一个 ensureActive 检测 , 检测当前的流是否取消 , 因此, 在flow 流构建器 中 , 循环执行的 FlowCollector#emit 发射操作 , 是可以取消的 ; 在Flow#collect 代码块中 , 执行 Job#cancel 函数 , 即可 取消该流收集操作所在的协程...
在Flow#collect 代码块中 , 执行 Job#cancel 函数 , 即可 取消该流收集操作所在的协程 , 进而取消了流 ; /** * 用一个可选的cancel [cause]取消这个作用域,包括它的作业和它的所有子任务。 * 原因可用于指定错误消息或提供有关的其他详细信息
onBufferOverflow- 配置缓冲区溢出的操作(可选,默认为暂停尝试发出值) 使用SharedFlow 你可以写个FlowEventBus。 //创建 val signEvent=MutableSharedFlow <String> //监听 coroutineScope.launch{ signEvent.collect{value-> println(value) } } //赋值
Flow#launchIn 函数返回值是 Job 对象 , 是 协程任务对象 , 可调用 Job#cancel 函数取消该协程任务 ; 2、Flow#launchIn 函数原型 Flow#launchIn 函数原型 : 代码语言:javascript 复制 /** * 终端流操作符,在[作用域]中[启动][启动]给定流的[收集][收集]。
overridefunonReceive(value:Int){ coroutine.resume(value) } } callback.onReceive(1) //再来一次 ! callback.onReceive(2) } } 如果,我们尝试resume多次,此时协程则会抛异常: 那么,Flow 仅仅是能返回多个值就值得如此力荐?当然不是,推荐它的原因更多是它丰富的操作符,用 Flow 能低成本的异步处理数据,下...
//如果不使用cancellable操作符 取消会失败,因为协程比较繁忙。funtestCancel()=runBlocking<Unit>{flow<Int>{for(iin1..5){println("emit$i")emit(i)}}.cancellable().collect{println(it)if(it==3){cancel()}}}//print result//emit 1//1//emit 2//2//emit 3 ...