最近,Android宣布彻底废弃AsyncTask,推荐Coroutine作为首选的异步编程方案。

如果说AsyncTask被Coroutine替代毫无悬念,那RxJava与Coroutine如何取舍呢?

J神很早就就给出自己的看法了。当时Flow还未出现,现在J神恐怕连ObservableSubject也早就不用了。 RxJava在Android中被废弃的日子恐怕也不远了。

那么,一个既有的RxJava的MVVM项目如何简单地改造为Coroutine呢?

RxJava例子


以一个RxJava项目为例,Model层基于Single进行数据请求

class Api {fun fetchPersons(): Single<List<Person>> = ...
}
class ViewModel(private val api: Api = Api(),private val scheduler: Scheduler = Schedulers.io()
) {private val mutablePersons = MutableLiveData<List<Person>>()val persons: LiveData<List<Person>> = mutablePersonsfun onCreate() {api.fetchPersons().subscribeOn(scheduler).subscribe(mutablePersons::postValue)}
}

kotlinx-coroutines-rx2


kotlinx-coroutines-rx2 是个好东西,可以帮助我们在Rx2与Coroutine之间任意切换。

除了Rx2以外,Rx3等其他Reactive库也有支持https://github.com/Kotlin/kotlinx.coroutines/tree/master/reactive

Coroutine => Rx2

Rx2 => Coroutine


使用SingleSource.await,可以将上面例子中Model层的Single转换为suspend函数

class ViewModel(private val api: Api = Api(),private val coroutineContext: CoroutineContext = CommonPool
) {private val mutablePersons = MutableLiveData<List<Person>>()val persons: LiveData<List<Person>> = mutablePersonsfun onCreate() {launch(coroutineContext) {//将Rx请求转换挂起函数val persons = api.fetchPersons().await()mutablePersons.postValue(persons)}}
}

更多注意事项


虽然例子中几乎毫不费力地将Rx转换为了Coroutine,但若要用在实际项目中,可能还要稍微加工一下:

class PersonsViewModel(private val api: Api = Api(),coroutineContext: CoroutineContext = CommonPool
) : ViewModel() {private val compositeJob = Job() //1private val mutablePersons = MutableLiveData<List<Person>>()val persons: LiveData<List<Person>> = mutablePersonsinit {launch(coroutineContext, parent = compositeJob) {try { //2val persons = api.fetchPersons().await()mutablePersons.postValue(persons)} catch (e: Exception) {...}}}override fun onCleared() {compositeJob.cancel() }
  1. 启动协程时指定的父Job,在onCleared时统一cancel,避免泄露。当然这个工作现在可以通过ViewModel的KTX扩展来做
  2. launch中通过try...catch...替代Rx的onError捕获异常,关于Coroutine的异常捕获的更多内容可参考Kotlin Coroutine 最佳实践

与RxJava共享Schedulers


使用Scheduler.asCoroutineDispatcher可以将RxJava的Schedulers转为Dispatcher,让重构前后的线程池不变,保证一致性。

object AppCoroutineDispatchers(val io: CoroutineContext = Schedulers.io().asCoroutineDispatcher(),val computation: CoroutineContext = Schedulers.computation().asCoroutineDispatcher(),val ui: CoroutineContext = UI
)//use
launch(AppCoroutineDispatchers.io) { ... }

最后看一波反向操作


虽然Android更推荐使用Coroutine,但是kotlinx-coroutines-rx2 还是很友好地提供了Coroutine转Rx2的API,所以顺道看一下如何进行反向操作:

使用rxSingle将挂起函数转为Single

class Api {suspend fun fetchPersons(): List<Person> = ...
}
class ViewModel(private val api: Api = Api(),private val scheduler: Scheduler = Schedulers.io(),val coroutineContext: CoroutineContext = CommonPool
) {private val mutablePersons = MutableLiveData<List<Person>>()val persons: LiveData<List<Person>> = mutablePersonsfun onCreate() {rxSingle(coroutineContext) { api.fetchPersons() }.subscribeOn(scheduler).subscribe(mutablePersons::postValue)}
}

【Kotlin协程】基于RxJava项目的Coroutine改造相关推荐

  1. Android中使用Kotlin协程代替RxJava封装网络请求

    现在的Android项目普遍使用Retrofit+RxJava的组合实现网络接口请求与数据的展现.这一功能通过Kotlin语言的协程功能也可以很方便的实现. 相比较而言,RxJava功能过于强大,如果 ...

  2. 一文看透 Kotlin 协程本质

    前言 公司开启新项目了,想着准备亮一手 Kotlin 协程应用到项目中去,之前有对 Kotlin 协程的知识进行一定量的学习,以为自己理解协程了,结果--实在拿不出手! 为了更好的加深记忆和理解,更全 ...

  3. 大型Android项目架构:基于组件化+模块化+Kotlin+协程+Flow+Retrofit+Jetpack+MVVM架构实现WanAndroid客户端

    前言:苟有恒,何必三更眠五更起:最无益,莫过一日曝十日寒. 前言 之前一直想写个 WanAndroid 项目来巩固自己对 Kotlin+Jetpack+协程 等知识的学习,但是一直没有时间.这里重新行 ...

  4. 探索 Kotlin 协程原理

    接下来跟大家分享一下我在了解 Kotlin 协程实现的过程中理解的一些概念,如果你发现哪些地方我说错了的话,欢迎提出你的理解. 1. Kotlin 协程原理概述 Kotlin 协程的大致的执行流程如上 ...

  5. Kotlin协程:协程的基础与使用

    一.协程概述 1.概念 协程是Coroutine的中文简称,co表示协同.协作,routine表示程序.协程可以理解为多个互相协作的程序.协程是轻量级的线程,它的轻量体现在启动和切换,协程的启动不需要 ...

  6. 一文快速入门 Kotlin 协程

    一.Kotlin 协程 Kotlin 协程提供了一种全新处理并发的方式,你可以在 Android 平台上使用它来简化异步执行的代码.协程从 Kotlin 1.3 版本开始引入,但这一概念在编程世界诞生 ...

  7. android 协程,Android 上的 Kotlin 协程

    协程是一种并发设计模式,您可以在 Android 平台上使用它来简化异步执行的代码.协程是在版本 1.3 中添加到 Kotlin 的,它基于来自其他语言的既定概念. 在 Android 上,协程有助于 ...

  8. pdf 深入理解kotlin协程_协程初探

    Hello,各位朋友,小笨鸟我回来了! 近期学习了Kotlin协程相关的知识,感觉这块技术在项目中的可应用性很大,对项目的开发效率和维护成本有较大的提升.于是就考虑深入研究下相关概念和使用方式,并引入 ...

  9. Kotlin协程在项目中的实际应用

    前言 本来我想写个协程三部曲,但是查了下貌似协程x的api和协程基础讲的比较多了,但是实战讲的很少,或者讲实战也只是怎么用别人封装好的三方库对应的支持(retrofit,ViewModel,room等 ...

最新文章

  1. Gartner:2018年十大科技趋势与其对IT和执行的影响
  2. 基于SSH实现固定资产管理系统
  3. Angular 里 unknown 和 any 的区别
  4. 1小时搞懂设计模式之工厂模式(简单工厂)
  5. OpenCASCADE Texture Mapping
  6. MES系统整体解决方案
  7. IOS开发之——硬件开发-加速计应用实例(04)
  8. linux ipk,openwrt下ipk生成过程及原理
  9. windows自带桌面管理工具使用方法
  10. 不谋全局者 , 不足以谋一域 : 不谋万世者 , 不足以谋一时
  11. Ubuntu18.04网络连接图标上显示问号
  12. c语言如何实现人民币转换编程,C语言成序设计实现人民币小写金额与大写金额的转换.docx...
  13. 生意精:说说如何开好一家小超市!
  14. 平面设计和ui设计_美丽的平面UI设计展示
  15. 碟评--梁紫丹新碟<<紫色的声音>>
  16. 微信小程序答题赢红包 微信答题小程序抢红包,答题领微信零钱红包,答题红包小程序,可以自己出题考试的小程序
  17. python猪脸识别_没想到,这是一家AI公司
  18. java内部类多继承_内部类和多继承
  19. django+wkhtmltopdf后端生成pdf
  20. SHARP AR-2048D/2348D

热门文章

  1. 谁是卧底服务器维护什么意思,谁是卧底?让“风险员工”无处遁形!
  2. GPT-2隐私泄露论文阅读:Extracting Training Data from Large Language Models
  3. python成语填空_python定期循环成语?
  4. Confluent6.0平台搭建
  5. Excel转Markdown表格
  6. 两个坚持是什么_老公坚持离婚怎样挽回?怎么做才能挽回老公的心
  7. 有关支付宝的沙箱环境
  8. 在线直播源码,npm设置镜像的方法 可切换
  9. 基于B/S架构的合同信息管理系统(Java+Web+MySQL)
  10. JavaScript表单生成器