- 译者:PhxNirvana
- 校对者:jamweak、jerry-shao
引言
Kotlin 的协程是否让 RxJava 和 响应式编程光辉不再 了呢?答案取决于你询问的对象。狂信徒和营销者们会毫不犹豫地是是是。如果真是这样的话,开发者们迟早会将 Rx 代码用协程重写一遍,抑或从一开始就用协程来写。 因为 协程 目前还是实验性的,所以目前的诸如性能瓶颈之类的不足,都将逐渐解决。因此,相对于原生性能,本文的重点更在于易用性方面。
方案设计
假设有两个函数,f1 和 f2,用来模仿不可信的服务,二者都会在一段延迟之后返回一个数。调用这两个函数,将其返回值求和并呈现给用户。然而如果 500ms 之内没有返回的话,就不再指望它会返回值了,因此我们会在有限次数内取消并重试,直到超过次数最终放弃请求。
协程的方式
协程用起来就像是传统的 基于 ExecutorService 和 Future 的工具套装, 不同点在于协程的底层是用的挂起、状态机和任务调度来代替线程阻塞的。
首先,写两个函数来实现延迟操作:
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 的函数式,