欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > java >内容正文

java

RxJava学习-使用篇

发布时间:2024/2/28 java 36 豆豆
生活随笔 收集整理的这篇文章主要介绍了 RxJava学习-使用篇 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

前言:

  • 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的声明周期事件注册一个回调,
  • 方法含义
    doOnEachObservable每发射一次数据调用一次
    doOnNext执行OnNext的时候调用
    doOnSubscribe观察者订阅Observable时候调用
    doOnUnsubscribe取消订阅的时候使用
    doOnCompletedObservable正常终止调用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学习-使用篇的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。