当前位置: 首页 > 知识库问答 >
问题:

从常规java函数向kotlin的流发送数据

微生鸿轩
2023-03-14

我有一个无法更改的外部接口:

interface ExternalApi {
    fun onDataReceived(data: String)
}

我需要开始使用数据,并将其发送到< code>flow。数据顺序是必须的。我想要一个冷< code >流,但是我找不到一个具有< code>emit函数的冷< code >流版本,所以我使用热< code >流重放设置为最大值作为解决方法。这是我的第一次尝试:

class FlowProblem {
    val flow: MutableSharedFlow<String> = MutableSharedFlow(replay = Int.MAX_VALUE)

    fun startConsuming() {
        object : ExternalApi {
            override fun onDataReceived(data: String) {
                flow.emit(data)
            }
        }
    }
}

不幸的是,它不起作用,因为 emit 函数是一个挂起的函数。但是,这是一个外部接口,我无法添加挂起修饰符。我也试图做这样的事情:

override fun onDataReceived(data: String) {
    val coroutineScope = CoroutineScope(Job())
    coroutineScope.launch {
        flow.emit(data)
    }
}

但对我来说,创建新的协程只是为了让数据流动是有点愚蠢的。我还想知道数据顺序。

我该怎么办?也许流量/通道不适合这里,我应该选择另一个?

共有1个答案

洪鸿博
2023-03-14

感谢IR42,callbackFlow正是我所需要的。

 类似资料:
  • 如何使用Kotlin声明并调用以函数列表为参数的函数。我在单个函数的函数中使用了参数,但是如何在函数列表中使用参数呢? 这个问题展示了如何将一个函数发送给一个函数:Kotlin:如何将一个函数作为参数传递给另一个函数?对于一系列函数,最好的方法是什么?

  • 我有一个关于Spring WebFlux的问题。我想创建一个使用内容类型text/event-stream的反应endpoint。不是生产而是消费。我们的一个服务需要向另一个服务发送大量的小对象,我们认为这样流式传输可能是一个很好的解决方案。 流量是每1秒产生一个值的流。我遇到的问题是,WebClient完全读取发布服务器,然后将数据作为一个整体发送,而不是一个接一个地流式传输。我能用这个客户机或

  • 我试图发送一个包含压缩(gzip)流输出的响应。我当前的代码是: 当我请求这项服务时,我的浏览器中会出现乱七八糟的数据。尽管我的响应正确设置了以下标题,但似乎我遗漏了什么:内容编码:gzip和传输编码:chunked。 在我的单元测试中,如果我提取主体并通过GzipInputStream()读取它,我就能够检索json主体。 当我更换时: 具有 val os=DeflaterOutputStrea

  • 我在VPC中使用AWS Chalice托管了一个Lambda函数,因为我希望它访问一个无服务器的Aurora DB实例。现在,我还希望这个函数将send_message()转换为SQS。

  • 例外情况。kt: 在科特林: 它在kotlin中工作,函数是内联的。 但是当在Java代码中使用时,它就是不能内联,仍然是一个正常的静态方法调用(从反编译的内容中可以看出)。 像这样的东西:

  • 我在Kotlin文件中定义了扩展函数。 其中是(生成的)java类。现在,我想用正常的java代码访问它: 然而,那是行不通的。IDE将无法识别方法,编译失败。