日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

RxJava学习-使用篇

發(fā)布時間:2024/2/28 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RxJava学习-使用篇 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言:

  • 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),
  • 方法含義
    doOnEachObservable每發(fā)射一次數(shù)據(jù)調(diào)用一次
    doOnNext執(zhí)行OnNext的時候調(diào)用
    doOnSubscribe觀察者訂閱Observable時候調(diào)用
    doOnUnsubscribe取消訂閱的時候使用
    doOnCompletedObservable正常終止調(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)容還不錯,歡迎將生活随笔推薦給好友。