【Kotlin协程】基于RxJava项目的Coroutine改造
最近,Android宣布彻底废弃
AsyncTask
,推荐Coroutine
作为首选的异步编程方案。
如果说AsyncTask被Coroutine替代毫无悬念,那RxJava
与Coroutine如何取舍呢?
J神很早就就给出自己的看法了。当时Flow还未出现,现在J神恐怕连Observable
、Subject
也早就不用了。 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() }
- 启动协程时指定的父Job,在
onCleared
时统一cancel
,避免泄露。当然这个工作现在可以通过ViewModel
的KTX扩展来做 - 在
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改造相关推荐
- Android中使用Kotlin协程代替RxJava封装网络请求
现在的Android项目普遍使用Retrofit+RxJava的组合实现网络接口请求与数据的展现.这一功能通过Kotlin语言的协程功能也可以很方便的实现. 相比较而言,RxJava功能过于强大,如果 ...
- 一文看透 Kotlin 协程本质
前言 公司开启新项目了,想着准备亮一手 Kotlin 协程应用到项目中去,之前有对 Kotlin 协程的知识进行一定量的学习,以为自己理解协程了,结果--实在拿不出手! 为了更好的加深记忆和理解,更全 ...
- 大型Android项目架构:基于组件化+模块化+Kotlin+协程+Flow+Retrofit+Jetpack+MVVM架构实现WanAndroid客户端
前言:苟有恒,何必三更眠五更起:最无益,莫过一日曝十日寒. 前言 之前一直想写个 WanAndroid 项目来巩固自己对 Kotlin+Jetpack+协程 等知识的学习,但是一直没有时间.这里重新行 ...
- 探索 Kotlin 协程原理
接下来跟大家分享一下我在了解 Kotlin 协程实现的过程中理解的一些概念,如果你发现哪些地方我说错了的话,欢迎提出你的理解. 1. Kotlin 协程原理概述 Kotlin 协程的大致的执行流程如上 ...
- Kotlin协程:协程的基础与使用
一.协程概述 1.概念 协程是Coroutine的中文简称,co表示协同.协作,routine表示程序.协程可以理解为多个互相协作的程序.协程是轻量级的线程,它的轻量体现在启动和切换,协程的启动不需要 ...
- 一文快速入门 Kotlin 协程
一.Kotlin 协程 Kotlin 协程提供了一种全新处理并发的方式,你可以在 Android 平台上使用它来简化异步执行的代码.协程从 Kotlin 1.3 版本开始引入,但这一概念在编程世界诞生 ...
- android 协程,Android 上的 Kotlin 协程
协程是一种并发设计模式,您可以在 Android 平台上使用它来简化异步执行的代码.协程是在版本 1.3 中添加到 Kotlin 的,它基于来自其他语言的既定概念. 在 Android 上,协程有助于 ...
- pdf 深入理解kotlin协程_协程初探
Hello,各位朋友,小笨鸟我回来了! 近期学习了Kotlin协程相关的知识,感觉这块技术在项目中的可应用性很大,对项目的开发效率和维护成本有较大的提升.于是就考虑深入研究下相关概念和使用方式,并引入 ...
- Kotlin协程在项目中的实际应用
前言 本来我想写个协程三部曲,但是查了下貌似协程x的api和协程基础讲的比较多了,但是实战讲的很少,或者讲实战也只是怎么用别人封装好的三方库对应的支持(retrofit,ViewModel,room等 ...
最新文章
- Gartner:2018年十大科技趋势与其对IT和执行的影响
- 基于SSH实现固定资产管理系统
- Angular 里 unknown 和 any 的区别
- 1小时搞懂设计模式之工厂模式(简单工厂)
- OpenCASCADE Texture Mapping
- MES系统整体解决方案
- IOS开发之——硬件开发-加速计应用实例(04)
- linux ipk,openwrt下ipk生成过程及原理
- windows自带桌面管理工具使用方法
- 不谋全局者 , 不足以谋一域 : 不谋万世者 , 不足以谋一时
- Ubuntu18.04网络连接图标上显示问号
- c语言如何实现人民币转换编程,C语言成序设计实现人民币小写金额与大写金额的转换.docx...
- 生意精:说说如何开好一家小超市!
- 平面设计和ui设计_美丽的平面UI设计展示
- 碟评--梁紫丹新碟<<紫色的声音>>
- 微信小程序答题赢红包 微信答题小程序抢红包,答题领微信零钱红包,答题红包小程序,可以自己出题考试的小程序
- python猪脸识别_没想到,这是一家AI公司
- java内部类多继承_内部类和多继承
- django+wkhtmltopdf后端生成pdf
- SHARP AR-2048D/2348D
热门文章
- 谁是卧底服务器维护什么意思,谁是卧底?让“风险员工”无处遁形!
- GPT-2隐私泄露论文阅读:Extracting Training Data from Large Language Models
- python成语填空_python定期循环成语?
- Confluent6.0平台搭建
- Excel转Markdown表格
- 两个坚持是什么_老公坚持离婚怎样挽回?怎么做才能挽回老公的心
- 有关支付宝的沙箱环境
- 在线直播源码,npm设置镜像的方法 可切换
- 基于B/S架构的合同信息管理系统(Java+Web+MySQL)
- JavaScript表单生成器