I/System.out:收集元素0I/System.out:收集元素1I/System.out:收集元素2I/System.out:收集元素3I/System.out:onCompletion 代码块,收集元素完毕 五、onCompletion 代码块中获取异常信息 在onCompletion 代码块中进行收尾 时 , 如果是因为异常导致 Flow 流收集元素失败 , 则可以在 onCompletion 代码块中拿到异常信...
invokeOnCompletion方法则是方便我们监听协程完成后的操作,具体示例代码如下: valjob = launch() { } job.invokeOnCompletion{//相关逻辑} 这里通过IDE的代码提示,可以看见invokeOnCompletion方法还可以接受2个参数 onCancellingjob被取消是否触发当前回调,默认为false invokeImmediately指示指定的代码块是否应立即调用,而不...
如果没有为协程指定异常处理器,那么异常将被传递给它的父任务。 你可以通过invokeOnCompletion方法来为Job添加一个异常处理器: coroutineScope.launch { // ... }.invokeOnCompletion { cause -> if (cause != null) { // 处理异常 } } Job的实践应用 在实际应用中,Job常常用于管理一组相关的协程。例如,...
通过invokeOnCompletion方法注册执行完成的回调,来感知子协程的执行情况;
在onCompletion 代码块中进行收尾 时 , 如果是 因为异常导致 Flow 流收集元素失败 , 则可以 在 onCompletion 代码块中拿到异常信息 ; 二、onCompletion 函数原型 onCompletion 函数原型如下 : /** *在**流完成或取消后,返回一个调用给定[action] **的流 ...
val channel = Channel<E>(capacity, onBufferOverflow) // 计算新的上下文 val newContext = newCoroutineContext(context) // 创建协程 val coroutine = ProducerCoroutine(newContext, channel) // 监听完成事件 if (onCompletion != null) coroutine.invokeOnCompletion(handler = onCompletion) ...
可以方便地使用像 invokeOnCompletion {doSomething()} 这些 lambda 函数。如果想要处理完成的类,可以通过在类中直接实现函数 type () -> Unit 来简化和优化代码,而不需要创建额外的 lambda 。class MyCompletionHandler : () -> Unit { override fun invoke() { doSomething() }} 从Kotlin 1.6开始,...
}.invokeOnCompletion{throwable-> if(throwableisCancellationException){ println("Coroutine 1 got cancelled!") } } scope.launch{ println("child 2") delay(100) println("child 2 throws exception") throwRuntimeException() } Thread.sleep(2000) ...
(cause: CancellationException? =null)//挂起协程直到此Job完成publicsuspend funjoin()//取消任务并等待任务完成,结合了[cancel]和[join]的调用publicsuspend fun Job.cancelAndJoin()//给Job设置一个完成通知,当Job执行完成的时候会同步执行这个函数publicfuninvokeOnCompletion(handler: CompletionHandler): Disposable...
}.invokeOnCompletion { throwable -> if(throwableisCancellationException) { println("Coroutine 1 got cancelled!") } } scope.launch { println("child 2") delay(100) println("child 2 throws exception") throwRuntimeException() } Thread.sleep(2000) ...