前言:
Observer 观察者决定事件触发时有什么行为。Observable 决定什么时候触发事件,以及触发什么事件Action 取代被观察者,决定触发什么事件,不完整回调
create just from 都是用来创建Observable的,create 用来创建无参Observable,just用来创建一个Observable,而from用来创建一个集合的Observable,参数是一个List。
一. 创建操作符
interval 隔一段时间发射整数序列的Observable,可以实现定时器:
Observable.interval(3, TimeUnit.SECONDS).subscribe {Log.d("tag", "interval: $it")}// 1 2 3 4 5 6 7 8 ...
创建发射指定范围的Observable,代替for
Observable.range(0, 6).subscribe {Log.d("tag", "interval: $it")}// 1 2 3 4 5
创建一个N次重复发射特定数据的Observable
Observable.range(0, 2).repeat(2).subscribe {Log.d("tag", "interval: $it")}// 0 1 0 1
二. 变换操作符
map : 变化操作符,可以把一个Observable变成一个新的Observable对象
Observable.just("haha").map {it + "word"}.subscribe{Log.d("tag",it)}
flatMap concatMap : 对将集合中的每个元素进行操作。caoncatMap是保证顺序的。
val fruitList = listOf<String>("apple", "banana", "orange")Observable.from(fruitList).concatMap { Observable.just(it + "word") }.subscribe {Log.d("tag :", it)}val fruitList2 = listOf<String>("apple", "banana", "orange")Observable.from(fruitList2).flatMap { Observable.just(it + "word") }.subscribe {Log.d("tag :", it)}
//appleword bananaword orangeword
flatMapIterable 将一个序列转变成一个Iterable接口的集合
Observable.just(1,"asd",true).flatMapIterable {val mList = mutableListOf<Any>()mList.add(it)mList}.subscribe{Log.d("tag" , ""+it);}
// D/tag: [1]
// D/tag: [asd]
// D/tag: [true]
在这里实际上创建了三个MutableList,没创建一个调用一次subsribe方法。
buffer
这里拿前面的例子略加修改
Observable.just(1,"asd",true).flatMapIterable {val mList = mutableListOf<Any>()mList.add(it)mList}.buffer(2).subscribe{Log.d("tag" , ""+it);}// D/tag: [1, asd]
// D/tag: [true]
这里其实还是创建了三个mutableListOf对象,只是存了两个对象之后在发射消息。
groupBy 按照某个规则分组
data class Student(val name : String, val mClass : Int)val s1 = Student("Tom",1)val s2 = Student("Hey",2)val s3 = Student("Jim",1)val s4 = Student("Amy",1)val s5 = Student("Cat",2)val s6 = Student("Pat",3)val groupObObservable.just(s1,s2,s3,s4,s5,s6).groupB{t.mClass}Observable.concat(groupOb).subscribe{Log.d("tag",it.name + " " + it.mClass)// D/tag: Tom 1// D/tag: Jim 1// D/tag: Amy 1// D/tag: Hey 2// D/tag: Cat 2// D/tag: Pat 3
三. 过滤操作符
filter:过滤指定条件的元素
用上面的例子
data class Student(val name : String, val mClass : Int)val s1 = Student("Tom",1)val s2 = Student("Hey",2)val s3 = Student("Jim",1)val s4 = Student("Amy",1)val s5 = Student("Cat",2)val s6 = Student("Pat",3)Observable.just(s1,s2,s3,s4,s5,s6).filter {it.mClass > 1}.subscribe{Log.d("tag",it.name + " " + it.mClass)}// D/tag: Tom 2// D/tag: Jim 1 // D/tag: Pat 3
elementAt
data class Student(val name : String, val mClass : Int)val s1 = Student("Tom",2)val s2 = Student("Hey",2)val s3 = Student("Jim",1)val s4 = Student("Amy",1)val s5 = Student("Cat",2)val s6 = Student("Pat",3)val list = mutableListOf<Student>(s1,s2,s3,s4,s5,s6)Observable.from(list).elementAt(2).subscribe{Log.d("tag",it.name + " " + it.mClass)}// D/tag: Jim 1
distinct 过滤元素,不可变对象或基本类型可以不写参数
data class Student(val name : String, val mClass : Int)val s1 = Student("Tom",2)val s2 = Student("Hey",2)val s3 = Student("Jim",1)val s4 = Student("Amy",1)val s5 = Student("Cat",2)val s6 = Student("Pat",3)val list = mutableListOf<Student>(s1,s2,s3,s4,s5,s6)Observable.from(list).distinct{it.mClass}.subscribe{Log.d("tag",it.name + " " + it.mClass)}
skip take 跳过/取前n项
skipLast takeLast 从后面
data class Student(val name : String, val mClass : Int)val s1 = Student("Tom",2)val s2 = Student("Hey",2)val s3 = Student("Jim",1)val s4 = Student("Amy",1)val s5 = Student("Cat",2)val s6 = Student("Pat",3)val list = mutableListOf<Student>(s1,s2,s3,s4,s5,s6)Observable.from(list).skip(2).subscribe{Log.d("tag",it.name + " " + it.mClass)}```// D/tag: Jim 1// D/tag: Amy 1// D/tag: Cat 2// D/tag: Pat 3
不常用
ignoreElement 忽略元素throleFirst:定期发送这个时间段里源Observable发射的第一个数据throttleWithTimeOut: 每次源Observable发射出来一个数据后就要计时。如果在设定好的时间结束前有源Observable发送新的数据出来,那么这个数据就会丢弃。同时throttleWithTimeOut重新开始计时。
四. 组合操作符
startWith 在元素前面添加元素
Observable.just(3,4,5).startWith(1,2).subscribe{Log.d("tag",it.toString())}// 1,2,3,4,5
merge concat 合并
val obj1 = Observable.just(1,2,3);val obj2 = Observable.just(4,5,6);Observable.merge(obj1,obj2).subscribe{Log.d("tag",it.toString());}// 1,2,3,4,5,6
zip 合并Observable并指定合并方式
val obj1 = Observable.just(1, 2, 3).subscribeOn(Schedulers.io());val obj2 = Observable.just(4, 5, 6);Observable.zip(obj1, obj2) { t1, t2 ->t1 + t2}.subscribe{Log.d("tag",it.toString())}
combineLastest 第一个Observable发射完再发射
val obj1 = Observable.just(1, 2, 3);val obj2 = Observable.just(4, 5, 6);Observable.combineLatest(obj1,obj2) { t1, t2 ->" $t1 + $t2 "}.subscribe{Log.d("tag",it.toString())}
五. 辅助操作符
delay 让原始Observable在发射每项数据之前都暂停一段时间。
Observable.create(Observable.OnSubscribe<Long> {it.onNext(System.currentTimeMillis())}).delay(2,TimeUnit.SECONDS).subscribe{Log.d("tag" , "" + (System.currentTimeMillis() - it) )}// 2003
Do 为原始Observable的声明周期事件注册一个回调,
方法含义
| doOnEach | Observable每发射一次数据调用一次 |
| doOnNext | 执行OnNext的时候调用 |
| doOnSubscribe | 观察者订阅Observable时候调用 |
| doOnUnsubscribe | 取消订阅的时候使用 |
| doOnCompleted | Observable正常终止调用onCompleted时调用 |
| doOnError | 当Observable异常终止的时候调用onError时调用。 |
| doOnTerminate | 当OBservable终止之前会被调用 |
| finallyDo | 当Observable终止之后会被调用 |
subscribeOn oberveOn
subscribeOn表示Observable自身在那个线程上运行,如果执行的是耗时的操作,那么可以让他在新开的一个子线程上运行。observerOn表示Observer所运行的线程。一般在主线程中运行,这样可以修改ui。
timeout
如果Observable在指定的一段时间没有发射数据,那么timeout会以一个OnError终止通知这个Observable,或者执行一个备用的Observable。
Observable.create(Observable.OnSubscribe<Int> {for(i in 0 until 5){try {Thread.sleep(i * 100.toLong())}catch (e : Exception){}it.onNext(i);}}).timeout(200, TimeUnit.MILLISECONDS,Observable.just(11,12)).subscribe{Log.d("tag", it.toString())}// 0 1 2 11 12
六. 条件操作符和布尔操作符
all 是否全部满足contains 是否包括某一个数据isEmpty 判断是否发射过数据amb 对于给定的Observable,它只会发射首先发射的数据或通知的那个Observable的所有数据。defaultIfEmpty 如果原始Observable没有发射数据,就发射一个默认的数据。
七. 转换操作符
toList toList操作符发射多项数据且为每一项数据调用onNext方法的Observable发射的多项数据组合成一个List,然后通过onNext传递整个列表
Observable.just(1, 2, 3).toList().subscribe {Log.d("tag", it.toString());}// [1,2,3]
toSortList 在toList操作的基础上进行排序操作toMap
data class Student(val name : String, val mClass : Int)val s1 = Student("Tom",2)val s2 = Student("Hey",2)val s3 = Student("Jim",1)val s4 = Student("Amy",1)val s5 = Student("Cat",2)val s6 = Student("Pat",3)val list = mutableListOf<Student>(s1,s2,s3,s4,s5,s6)Observable.from(list).toMap {it.mClass}.subscribe{val class1Student = it[1]Log.d("tag" , class1Student.toString())}
总结
以上是生活随笔为你收集整理的RxJava学习-使用篇的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。