[译] 管中窥豹:RxJava 与 Kotlin 协程的对比(1)

本文探讨了Kotlin协程是否能够替代RxJava和响应式编程,重点在于易用性而非原生性能。通过示例展示了如何使用协程实现重试和取消操作,与使用RxJava实现的响应式编程进行对比,指出协程的代码更简洁,类似线性同步编程。同时,文中提到协程的取消机制可能存在延迟问题。
摘要由CSDN通过智能技术生成

引言

Kotlin 的协程是否让 RxJava 和 响应式编程光辉不再 了呢?答案取决于你询问的对象。狂信徒和营销者们会毫不犹豫地是是是。如果真是这样的话,开发者们迟早会将 Rx 代码用协程重写一遍,抑或从一开始就用协程来写。 因为 协程 目前还是实验性的,所以目前的诸如性能瓶颈之类的不足,都将逐渐解决。因此,相对于原生性能,本文的重点更在于易用性方面。

方案设计

假设有两个函数,f1f2,用来模仿不可信的服务,二者都会在一段延迟之后返回一个数。调用这两个函数,将其返回值求和并呈现给用户。然而如果 500ms 之内没有返回的话,就不再指望它会返回值了,因此我们会在有限次数内取消并重试,直到超过次数最终放弃请求。

协程的方式

协程用起来就像是传统的 基于 ExecutorServiceFuture 的工具套装, 不同点在于协程的底层是用的挂起、状态机和任务调度来代替线程阻塞的。

首先,写两个函数来实现延迟操作:

suspend fun f1(i: Int) {
Thread.sleep(if (i != 2) 2000L else 200L)
return 1;
}

suspend fun f2(i: Int) {
Thread.sleep(if (i != 2) 2000L else 200L)
return 2;
}

与协程调度有关的函数需要加上 suspend 关键字并通过协程上下文来调用。为了演示上面的目的,如果传入参数不是 2 的时候,函数会延迟 2s。这样就会让超时检测将其结束掉,并在第三次尝试时在规定时间内成功。

因为异步总会在结束时离开主线程,我们需要一个方法来在业务逻辑完成前阻塞它,以防止直接退出 JVM。为了达到目的,可以使用 runBlocking 在主线程中调用函数。

fun main(arg: Array) = runBlocking {

coroutineWay()

reactiveWay()
}

suspend func coroutineWay() {
// TODO implement
}

func reactiveWay() {
// TODO implement
}

相比 RxJava 的函数式,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值