概述
RxJava
是一个基于事件流、实现异步操作
的库。他可以很方便的实现异步操作。
RxJava
定义了 被观察者(Observable
)、观察者(Observer
)、订阅(Subscribe
)、事件(Event
)。
RxJava
可以应用到网络框架Retrofit
中。
使用
- 创建
Observable
& 生产事件 - 创建
Observer
& 定义相应事件行为 - 通过
Subscribe
连接被观察者
和观察者
基本用法
fun testObervableBase() {
//总共分为3步
// 1. 创建被观察值
val observable = Observable.create(ObservableOnSubscribe<Int> {
it.onNext(3)
it.onNext(2)
it.onNext(1)
it.onComplete()
})
// 也可以用这种简单的形式
// Observable.just("A", "B", "C")
// Observable.fromArray("A", "B", "C")
// 2. 创建观察者
val observer = object : Observer<Int> {
override fun onComplete() {
Log.i(TAG, "---rxJava complete")
ToastHelper.showToast("rxJava onComplete")
}
override fun onSubscribe(d: Disposable) {
Log.i(TAG, "---rxJava subscribe $d")
}
override fun onNext(t: Int) {
Log.i(TAG, "---rxJava next $t")
}
override fun onError(e: Throwable) {
Log.i(TAG, "---rxJava error $e")
}
}
// 3. 连接
observable.subscribe(observer)
}
Observable
提供了创建操作符,常见的有
create()
常规用法just()
直接发送事件,结束会自动发送onComplete
事件fromArray()
直接发送传入的数组数据,结束会自动发送onComplete
事件fromIterable()
直接发送传入的集合数据,结束会自动发送onComplete
事件empty()
仅发送onComplete
事件.
其他创建
defer()
直到有观察者(Observer )订阅时,才动态创建被观察者对象(Observable) & 发送事件。可用于动态改变事件的这种情况。timer()
延迟指定时间后,发送1个数值0(Long类型)interval()
发送的事件序列 = 从0开始、无限递增1的的整数序列。
变换操作符
创建以后,可以做变换,例如数据封装,类型转化等。常用有:
map()
将被观察者发送的事件转换为任意的类型事件。
flatMap()
将被观察者发送的事件序列进行 拆分 & 单独转换,再合并成一个新的事件序列,最后再进行发送。
另外,还支持多个Observable
合并,例如,concat()
merge()
操作符,见参考资料。
功能性操作符
subscribe()
delay()
观察者延迟一段时间再发送事件doXxx()
在某个事件的生命周期中调用onErrorReturn
遇到错误时,发送1个特殊事件 使其正常终止,相关的还有onErrorResumeNext()
onExceptionResumeNext()
区别就是,会不会走onError
retry()
重试,即当出现错误时,让被观察者(Observable)重新发射数据。repeat()
无条件地、重复发送 被观察者事件.
线程切换
默认被观察者(Observable)/ 观察者(Observer)的工作线程 = 创建自身的线程。
subscribeOn()
指定被观察者 生产事件的线程。只有第一次指定有效。
observeOn()
指定观察者 接收 & 响应事件的线程。每次指定均有效,即每指定一次,就会进行一次线程的切换。