RxJava 基本
1,创建:
1.1,已有数据创建,just() ,from()
// from 将数组或Iterable数据取出逐个发射
Observable<String> o = Observable.from("a", "b", "c");
def list = [5, 6, 7, 8]
Observable<Integer> o = Observable.from(list);
// just 将单个数据转换为发射的那个数据的Observable
// 如果是数据或者Iterable数据,将会作为单个数据
Observable<String> o = Observable.just("one object");
1.2,使用Create()创建Observable
同步的Observable示例
/**
* 这个例子展示了一个自定义的Observable,当有订阅时他会阻塞当前线程。
*/
def customObservableBlocking() {
return Observable.create { aSubscriber ->
50.times { i ->
if (!aSubscriber.unsubscribed) {
aSubscriber.onNext("value_${i}")
}
}
// after sending all values we complete the sequence
if (!aSubscriber.unsubscribed) {
aSubscriber.onCompleted()
}
}
}
// To see output:
customObservableBlocking().subscribe { println(it) }
异步的Observable示例
/**
* This example shows a custom Observable that does not block
* when subscribed to as it spawns a separate thread.
*/
def customObservableNonBlocking() {
return Observable.create({ subscriber ->
Thread.start {
for (i in 0..<75) {
if (subscriber.unsubscribed) {
return
}
subscriber.onNext("value_${i}")
}
// after sending all values we complete the sequence
if (!subscriber.unsubscribed) {
subscriber.onCompleted()
}
}
} as Observable.OnSubscribe)
}
// To see output:
customObservableNonBlocking().subscribe { println(it) }
3,变换操作
skip(10) 跳过最开始的10个,take(5) 获取接下来的5个,在订阅之前使用map() 转换他们,然后打印结果。
def simpleComposition() {
customObservableNonBlocking().skip(10).take(5)
.map({ stringValue -> return stringValue + "_xform"})
.subscribe({ println "onNext => " + it})
}
4,其他操作符
4.1创建操作
first() 获取第一个元素 = take(1).single()
empty() 创建一个不发射任何数据但是正常终止的observable
never() 创建一个不发射数据也不终止的Obserable,
throw(Java.lang.Throwable) 创建一个不发射数据以一个错误终止的Observable
interval(long,TimeUnit) 创建一个按固定间隔发射整数序列的Observable
range(int,int)创建一个发色好特定整数的Observable
repeat() 创建一个发射特定数据重复次数的Observable
start(fun(){}) 返回一个Observable,它发射一个类似于函数声明的值
timer(long,TimeUnit) 创建一个Observable,它在一个给定的延迟后发射一个特殊的值
4.2 变换操作
buffer() 定期收集Observable的数据放进一个数据包裹,然后发射这些数据包裹,而不是一次发射一个值。
flatMap() 将一个发射数据的Observable变换为多个Observables,然后将它们发射的数据合并后放进一个单独的Observable操作符,使用一个指定的函数对原始Observable发射的每一项数据执行变换操作,这个函数返回一个本身也发射数据的Observable,然后FlatMap
合并这些Observables发射的数据,最后将合并后的结果当做它自己的数据序列发射。注意:FlatMap
对这些Observables发射的数据做的是合并(merge
)操作,因此它们可能是交错的。在许多语言特定的实现中,还有一个操作符不会让变换后的Observables发射的数据交错,它按照严格的顺序发射这些数据,这个操作符通常被叫作ConcatMap
或者类似的名字。
map() 对Observable发射的每一项数据应用一个函数,执行变换操作,操作符对原始Observable发射的每一项数据应用一个你选择的函数,然后返回一个发射这些结果的Observable。
groupBy() 将一个Observable分拆为一些Observables集合,它们中的每一个发射原始Observable的一个子序列
scan() 连续地对数据序列的每一项应用一个函数,然后连续发射结果