前言:
Observer 觀察者決定事件觸發(fā)時有什么行為。 Observable 決定什么時候觸發(fā)事件,以及觸發(fā)什么事件 Action 取代被觀察者,決定觸發(fā)什么事件,不完整回調(diào)
create just from 都是用來創(chuàng)建Observable的,create 用來創(chuàng)建無參Observable,just用來創(chuàng)建一個Observable,而from用來創(chuàng)建一個集合的Observable,參數(shù)是一個List。
一. 創(chuàng)建操作符
interval 隔一段時間發(fā)射整數(shù)序列的Observable,可以實現(xiàn)定時器:
Observable.interval(3, TimeUnit.SECONDS).subscribe {Log.d("tag", "interval: $it")}// 1 2 3 4 5 6 7 8 ...
創(chuàng)建發(fā)射指定范圍的Observable,代替for
Observable.range(0, 6).subscribe {Log.d("tag", "interval: $it")}// 1 2 3 4 5
創(chuàng)建一個N次重復(fù)發(fā)射特定數(shù)據(jù)的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 將一個序列轉(zhuǎn)變成一個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]
在這里實際上創(chuàng)建了三個MutableList,沒創(chuàng)建一個調(diào)用一次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]
這里其實還是創(chuàng)建了三個mutableListOf對象,只是存了兩個對象之后在發(fā)射消息。
groupBy 按照某個規(guī)則分組
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 過濾元素,不可變對象或基本類型可以不寫參數(shù)
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:定期發(fā)送這個時間段里源Observable發(fā)射的第一個數(shù)據(jù) throttleWithTimeOut: 每次源Observable發(fā)射出來一個數(shù)據(jù)后就要計時。如果在設(shè)定好的時間結(jié)束前有源Observable發(fā)送新的數(shù)據(jù)出來,那么這個數(shù)據(jù)就會丟棄。同時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發(fā)射完再發(fā)射
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在發(fā)射每項數(shù)據(jù)之前都暫停一段時間。
Observable.create(Observable.OnSubscribe<Long> {it.onNext(System.currentTimeMillis())}).delay(2,TimeUnit.SECONDS).subscribe{Log.d("tag" , "" + (System.currentTimeMillis() - it) )}// 2003
Do 為原始Observable的聲明周期事件注冊一個回調(diào),
方法含義 doOnEach Observable每發(fā)射一次數(shù)據(jù)調(diào)用一次 doOnNext 執(zhí)行OnNext的時候調(diào)用 doOnSubscribe 觀察者訂閱Observable時候調(diào)用 doOnUnsubscribe 取消訂閱的時候使用 doOnCompleted Observable正常終止調(diào)用onCompleted時調(diào)用 doOnError 當(dāng)Observable異常終止的時候調(diào)用onError時調(diào)用。 doOnTerminate 當(dāng)OBservable終止之前會被調(diào)用 finallyDo 當(dāng)Observable終止之后會被調(diào)用
subscribeOn oberveOn
subscribeOn表示Observable自身在那個線程上運行,如果執(zhí)行的是耗時的操作,那么可以讓他在新開的一個子線程上運行。observerOn表示Observer所運行的線程。一般在主線程中運行,這樣可以修改ui。
timeout
如果Observable在指定的一段時間沒有發(fā)射數(shù)據(jù),那么timeout會以一個OnError終止通知這個Observable,或者執(zhí)行一個備用的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 是否包括某一個數(shù)據(jù) isEmpty 判斷是否發(fā)射過數(shù)據(jù) amb 對于給定的Observable,它只會發(fā)射首先發(fā)射的數(shù)據(jù)或通知的那個Observable的所有數(shù)據(jù)。 defaultIfEmpty 如果原始Observable沒有發(fā)射數(shù)據(jù),就發(fā)射一個默認的數(shù)據(jù)。
七. 轉(zhuǎn)換操作符
toList toList操作符發(fā)射多項數(shù)據(jù)且為每一項數(shù)據(jù)調(diào)用onNext方法的Observable發(fā)射的多項數(shù)據(jù)組合成一個List,然后通過onNext傳遞整個列表
Observable.just(1, 2, 3).toList().subscribe {Log.d("tag", it.toString());}// [1,2,3]
toSortList 在toList操作的基礎(chǔ)上進行排序操作 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())}
總結(jié)
以上是生活随笔 為你收集整理的RxJava学习-使用篇 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔 推薦給好友。