如何取消/取消订阅协程 Flow

2024-06-11

当我尝试提前取消流程时,我注意到一个奇怪的行为。看一下下面的例子。

这是一个发出整数值的简单流程

  private fun createFlow() = flow {
        repeat(10000) {
            emit(it)
        }
    }

然后我打电话给createFlow使用此代码的函数

  CoroutineScope(Dispatchers.Main).launch {
            createFlow().collect {

                Log.i("Main", "$it isActive $isActive")
                if (it == 2) {
                    cancel()
                }
            }
        }

这是打印出来的内容

0 isActive true
1 isActive true
2 isActive true
3 isActive false
4 isActive false
etc...etc

现在,我期望流一旦达到值 2,就应该停止发出整数,但实际上它会将 isActive 标志切换为 false 并继续发出,而不停止。

当我在发射之间添加延迟时,流量的行为符合我的预期。

private fun createFlow() = flow {
    repeat(10000) {
        delay(500) //add a delay
        emit(it)
    }
}

这是再次调用流程后打印出来的内容(这是预期的行为)。

0 isActive true
1 isActive true
2 isActive true

如何才能在不增加延迟的情况下精确取消指定值的流量发射?


我遇到了一个解决方法this https://github.com/Kotlin/kotlinx.coroutines/issues/1265相关问题

我已经更换了每一个collect with a safeCollect我的项目中的功能:

/**
 * Only proceed with the given action if the coroutine has not been cancelled.
 * Necessary because Flow.collect receives items even after coroutine was cancelled
 * https://github.com/Kotlin/kotlinx.coroutines/issues/1265
 */
suspend inline fun <T> Flow<T>.safeCollect(crossinline action: suspend (T) -> Unit) {
  collect {
    coroutineContext.ensureActive()
    action(it)
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何取消/取消订阅协程 Flow 的相关文章

随机推荐

  • Chrome 中的 HTML5 DataTransfer 检测错误

    尝试使用 Javascript 检测 DataTransfer 对象中是否支持文件属性 以下代码会在 Chrome 中导致 Uncaught ReferenceError DataTransfer is not Defined 但 IE F
  • 如何在 Django 中定义模型之间的多态关系?

    我正在开发一个 Django 应用程序 其中包含Offer模型 一个Offer实例包含定价条件并指向产品定义 产品模型实际上是一个层次结构 我有一个Television模型 一个Camcorder模型等 所以我想要Offer模型包含指向任何
  • idxmax() 不适用于包含 NaN 的 SeriesGroupBy

    这是我的代码 from pandas import DataFrame Series import pandas as pd import numpy as np income DataFrame name Adam Bill Chris
  • C++/CLI 从具有抽象方法的本机 C++ 类继承并将其公开给 C#

    我一直在谷歌上转圈子 试图找到一个成熟的例子 但没有成功 我有一个 C API 它提供了许多包含纯虚方法的类 供开发人员从中进行扩展 我试图做的是通过 C CLI 向 C 提供此接口 我已经设法将 API 编译到 C CLI 库中 但由于我
  • 图表外的 JQPlot 图例

    我正在使用 JQPlot 并且在一个 HTML 页面上有很多图表 每个图表都有相同的图例 我的问题是 是否可以完全在图表之外显示图例 并在 HTML 页面或自己的 div 中拥有自己的位置 legend show true renderer
  • TFS 2012 - 如何判断变更集是否经过代码审查?

    我们最近开始使用 Team Foundation Server 2012 并使用代码审查功能让其他开发人员审查代码更改 看起来效果很好 然而 作为项目负责人 我希望能够看到给定的变更集已被其他人审查 例如 假设开发人员 Bob 进行了更改并
  • 为什么不推荐多区域 Kubernetes 部署?

    Kubernetes 文档说支持多区域集群 但不支持多区域集群 同时 Kubernetes 都支持failure domain zone and failure domain region 让我的 Kubernetes 集群同时成为多专区和
  • FOSUserBundle 和 ACL 业务角色

    这个周末我开始学习 Symfony 2 我没有遇到任何问题 因为我认为该框架有详细记录 我正在使用 FOSUserBundle 包进行 ACL 我想知道是否可以使其类似于 Yii 框架 bizRule return Yii app gt u
  • 在哪里可以找到适用于 Windows 的 IBM JDK/JRE 的特定版本?

    我正在尝试让一个对 JDK 相当敏感的 Oracle 软件与 Websphere 一起使用 并且我需要找到一些特定版本的 IBM JDK 来尝试 问题是 IBM 并没有像 Sun Oracle 那样真正提供这些功能 而且我得到的所有版本都因
  • python pandas重命名列名开头

    我有多个具有统一列名的 Excel 文件 除了一个 一个文件将其称为 EndOfMarchStatus 另一个文件将其称为 EndofAprilStatus 依此类推 我需要将列名称更改为 EndofMonthStatus 我确实找不到与这
  • 使用 JOIN 或 EXISTS 可以获得更好的性能吗?

    我有两个表格 机构 和 结果 我想查看机构是否有任何结果 这样我就可以排除没有结果的机构 使用 JOIN 或 EXISTS 可以获得更好的性能吗 谢谢你 Nimesh 根据语句 统计信息和数据库服务器 这可能没有什么区别 可能会生成相同的优
  • 连接到专用远程 MSMQ 队列

    我正在尝试使用以下路径连接到远程专用 MSMQ 队列 FormatName DIRECT OS remoteMachineName Private MyQueue 我收到以下错误 The specified format name does
  • 造型 Sherlock ActionMode 背景

    似乎无法设置 ActionMode 背景的样式 我已经覆盖了操作栏背景 但设置 ActionMode 背景似乎不起作用
  • 二元除法问题:互联网上的坏例子或者我错过了什么?

    我想创建一个 16 位 CRC 实际上我已经完全准备好了 所以几个小时前我测试了它 但没有正常工作 但我发现互联网上的例子在涉及二进制除法时可能是错误的 我只链接其中两个 来自很多 http www ross net crc downloa
  • 使用 Spring 3 和 Servlet 3 配置 OpenSessionInViewFilter

    我想配置OpenSessionInViewFilter为了能够在视图中使用 hibernate 延迟初始化 所以我在 web xml 中添加了过滤器定义 但它不起作用 我仍然得到相同的延迟初始化异常 这就是我所做的
  • 如何在没有 (L)GPL 库的情况下在 Python 中创建双重身份验证 HTTPS 客户端?

    客户端和服务器都是内部的 各自都有一个由内部CA签名的证书和CA证书 我需要客户端根据服务器拥有的 CA 证书来验证服务器的证书 它还应该将其证书发送到服务器进行身份验证 The urllib2手册说不执行服务器身份验证 PycURL是一个
  • 如何使用 iloc[] 选择 pandas 数据帧的倒数第二行?

    我从网上获取数据并将该数据存储在 pandas 数据框中 但问题是数据帧格式每次都不相同 主要是行数 Print df shape Output 100 9 Print df shape Output 33 9 Print df shape
  • Google 图书 API 按 ISBN 搜索

    我正在尝试弄清楚如何使用 Google Books API 按 ISBN 搜索图书 我需要编写一个程序来搜索 ISBN 然后打印出书名 作者和版本 我尝试使用List volumesList books volumes list 但这不允许
  • { ...obj1, obj2 } 到底做什么[重复]

    这个问题在这里已经有答案了 假设我们有两个对象 const state fishes some obj data animals some obj data const animals some NEW data 在Vuex中有一个方法re
  • 如何取消/取消订阅协程 Flow

    当我尝试提前取消流程时 我注意到一个奇怪的行为 看一下下面的例子 这是一个发出整数值的简单流程 private fun createFlow flow repeat 10000 emit it 然后我打电话给createFlow使用此代码的