前言:
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学习-使用篇的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。