Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin outines使异步代码变得简单且易于编写。通过利用suspend关键字,您的代码看起来像同步代码_Kotlin_Rx Kotlin - Fatal编程技术网

Kotlin outines使异步代码变得简单且易于编写。通过利用suspend关键字,您的代码看起来像同步代码

Kotlin outines使异步代码变得简单且易于编写。通过利用suspend关键字,您的代码看起来像同步代码,kotlin,rx-kotlin,Kotlin,Rx Kotlin,我在项目中看到Rx的使用主要是为了替换回调,但如果您不打算修改您的体系结构以满足反应模式,Rx将是一个负担。考虑这个接口: interface Foo { fun bar(callback: Callback) } 协同程序等价物更显式,返回类型和关键字suspend表示它是一个异步操作 interface Foo { suspend fun bar: Result } 但Rx等效物存在一个问题: interface Foo { fun bar: Single<Res

我在项目中看到Rx的使用主要是为了替换回调,但如果您不打算修改您的体系结构以满足反应模式,Rx将是一个负担。考虑这个接口:

interface Foo {
   fun bar(callback: Callback)
}
协同程序等价物更显式,返回类型和关键字suspend表示它是一个异步操作

interface Foo {
   suspend fun bar: Result
}
但Rx等效物存在一个问题:

interface Foo {
   fun bar: Single<Result>
}
如果您没有正确地对其进行移植,那么将以一个只能触发一次的单端口结束,因为refreshData()是在bar()函数中调用的,而不是在订阅时调用的。诚然,这是一个初学者的错误,但问题是Rx不仅仅是一个回调替换,许多开发人员都很难掌握Rx


如果您的目标是将异步任务从回调转换为更好的范例,那么协同程序非常适合,而Rx会增加一些复杂性。

Kotlin协同程序不同于Rx。很难将它们一一比较,因为Kotlin协同程序是一种精简的语言特性(只有两个基本概念和几个基本函数来操作它们),而Rx是一个相当繁重的库,有大量现成的操作符。两者都是为了解决异步编程的问题而设计的,但是它们的解决方法非常不同:

  • Rx具有一种特殊的编程功能风格,几乎可以在任何编程语言中实现,而无需语言本身的支持。当手头的问题很容易分解成一系列标准操作符时,它工作得很好,否则就不那么好了

  • Kotlin协同程序提供了一种语言特性,允许库编写器实现各种异步编程风格,包括但不限于函数式反应式(Rx)。使用Kotlin协程,您还可以以命令式、基于承诺/未来的、参与者式等方式编写异步代码

比较Rx和一些基于Kotlin协程实现的特定库更合适

举个例子。该库提供了一组原语,如
async/await
,以及通常烘焙到其他编程语言中的通道。它还支持未来轻量化的演员。你可以在网上阅读更多


kotlinx.coroutines提供的信道在某些使用情况下可以替代或增强Rx。有一个单独的例子,深入探讨了与Rx的相同点和不同点

您链接的talk/doc不涉及频道。通道填补了您目前对协同程序和事件驱动编程的理解之间的空白

使用协程和通道,您可以像使用rx一样进行事件驱动编程,但您可以使用同步外观的代码进行编程,而无需使用尽可能多的“自定义”操作符

如果你想更好地理解这一点,我建议你看看kotlin以外的地方,那里的概念更加成熟和完善(不是实验性的)。查看Clojure中的
core.async
、丰富的Hickey视频、帖子和相关讨论


    • 协同程序旨在提供轻量级异步编程框架。在启动异步作业所需的资源方面是轻量级的。协同程序不强制使用外部API,对用户(程序员)来说更自然。相反,RxJava+RxKotlin有一个额外的数据处理包,Kotlin并不真正需要它,它在标准库中有一个非常丰富的API,用于序列和集合处理

      如果您想了解更多关于Android上协同程序的实际使用,我可以推荐我的文章:

      我非常了解RxJava,最近我转向了Kotlin协同程序和流程

      RxKotlin基本上与RxJava相同,它只是添加了一些语法糖,以使用Kotlin编写RxJava代码更加舒适/习惯

      RxJava和Kotlin协同程序之间的“公平”比较应该包括混合中的流,我将尝试在这里解释原因。这将是一个有点长,但我会尽量保持简单,我可以与例子

      使用RxJava,您有不同的对象(自版本2起):

      //无背压管理的0-n事件
      有趣的observeEventsA():可观察
      //具有显式背压管理的0-n事件
      趣味observeEventsB():可流动
      //正好是一个事件
      趣味加密(原始:字符串):单个
      //0-1事件
      有趣的缓存(键:字符串):也许
      //只是完成,没有具体结果
      fun syncPending():可完成
      
      在kotlin协程+流中,您不需要很多实体,因为如果没有事件流,您可以使用简单的协程(挂起函数):

      //0-n事件时,背压会自动消除
      有趣的观察事件():流
      //正好是一个事件
      挂起乐趣加密(原始:字符串):字符串
      //0-1事件
      挂起缓存(键:字符串):MyData?
      //只是完成,没有具体结果
      suspend fun syncPending()
      
      额外好处:Kotlin流/协同路由支持
      null
      值(使用RxJava 2删除支持)

      运营商呢? 使用RxJava,您有很多操作符(
      map
      filter
      flatMap
      switchMap
      ,…),对于大多数操作符,每个实体类型都有一个版本(
      Single.map()
      observeable.map()
      ,…)

      Kotlin协程+流不需要那么多操作符,让我们通过一些最常见操作符的示例来了解原因

      map()

      RxJava:

      fun getPerson(id:String):单身
      有趣的观察者():可观察
      fun getPersonName(id:String):单个{
      返回getPerson(id)
      .map{it.firstName}
      }
      有趣的观察家名字
      
      fun bar(callback: Callback) {
         setCallback(callback)
         refreshData()
      }