Rxjava2-关键字解读

外文网站:
http://reactivex.io/documentation/operators.html
Rxjava2系列教程:
http://www.apkbus.com/myspaceblog-898535.html
重要字段解读:
一、发射器常用类
Observable:普通的发射器
Flowable:有背压的发射器
Single: 是一个发射器,该发射器只会接收单一参数。
二、接收器常用类
Observer:完整的接收者
Consumer:简易的接收者,只会调出onNext方法,遇到错误时会引起崩溃
SingleObserver:是一个接受者,该接受者只会执行onSuccess、onError、onSubscribe三个方法。
Disposable:完整调用后产生的实例,可以通过该实例取消
三、线程切换
subscribeOn
用于指定发射器运行的线程,只能通过该字段指定一次,在发射器之后调用,之后再指定无效。
observeOn
用于指定接收器的运行的线程,可以通过该关键字多次指定接收器线程切换,需要在接收器之前调用。
四、do函数
以监听对应方法的方式,形成流式结构,所以通过do函数的插入,可以优化代码结构
这里写图片描述
4.1:do方法运行的线程是由它的上一个线程切换器控制(subscribeOn、observeOn)
五、关键字
5.1 创建发射器:
5.1.1 create:普通的创建发射器

public static <T> Observable<T> create(ObservableOnSubscribe<T> source) 

5.1.2 defer:每次订阅都会创建一个新的Observable,并且如果没有被订阅,就不会产生新的Observable

public static <T> Observable<T> defer(Callable<? extends ObservableSource<? extends T>> supplier) 

5.1.3 zip 传入多个发射器(最多9个),将发射出的数据组合起来,组合方式是A1B1 A2B2 ……

public static <T1, T2, R> Observable<R> zip(ObservableSource<? extends T1> source1, ObservableSource<? extends T2> source2,BiFunction<? super T1, ? super T2, ? extends R> zipper) 

5.1.4 concat 将A,B事件合并(最多四个)起来,成为一个新的发射器,数据发出严格按照发射器合并的顺序执行

public static <T> Observable<T> concat(ObservableSource<? extends T> source1, ObservableSource<? extends T> source2)

5.1.5 just 通过调用just关键字,创建一个发射器,发射指定对象数据(最多10个)

 public static <T> Observable<T> just(T item1, T item2, T item3) 

5.1.6 timer 通过调用timer关键字,设置一个定时任务,创建一个延时发射器

public static Observable<Long> timer(long delay, TimeUnit unit) 

5.1.7 interval 通过调用interval 关键字,创建一个心跳发射器,定时发送制定数据

public static Observable<Long> interval(long initialDelay, long period, TimeUnit unit) 

5.1.8 merge 将多个发射器结合起来(最多四个),与concat不同的是,这里数据发射的先后无法得到保证。

public static <T> Observable<T> merge(ObservableSource<? extends T> source1, ObservableSource<? extends T> source2) 

5.2数据处理关键字
5.2.1 window 将发射器发射的数据,通过指定数量重新分解成多个发射器,并不直接创建,知识分解

 public final Observable<Observable<T>> window(long count)

5.2.2 first 获取发射器发射出的第一个数据,当没有获取到数据时,返回默认指定值

 public final Single<T> first(T defaultItem)

5.2.3 last 获取发射器发射出的最后一个数据,当没有获取到数据时,返回默认指定值

public final Single<T> last(T defaultItem) 

5.2.4 take 获取发射器发出数据源的开始的指定数据(指定分为指定数量和指定时间)

public final Observable<T> take(long count)
public final Observable<T> take(long time, TimeUnit unit)

5.2.5 takeLast 获取发射器发出数据源的尾部的指定数据(指定分为指定数量和指定时间)

public final Observable<T> takeLast(int count)

5.2.6 skip 发射器发出数据源,接收器跳过指定的数量/时间接收数据

  public final Observable<T> skip(long count)
   public final Observable<T> skip(long time, TimeUnit unit)

5.2.7 debounce 将发射器发射出的数据按照指定的频率进行过滤,小于这个指定频率的数据将会被抛弃。(rxAndroid的多次点击只响应最后一次

 public final Observable<T> debounce(long timeout, TimeUnit unit))

5.2.8 map 针对发射器每次发射的数据执行数据变化处理

public final <R> Observable<R> map(Function<? super T, ? extends R> mapper) 

5.2.9 flatMap 针对发射器发射出的数据执行数据处理,然后无序发射出多个发射器

public final <R> Observable<R> flatMap(Function<? super T, ? extends ObservableSource<? extends R>> mapper)

5.2.10 concatMap 针对发射器发射出的数据执行数据处理,按顺序发射出多个发射器

public final <R> Observable<R> concatMap(Function<? super T, ? extends ObservableSource<? extends R>> mapper)

5.2.11 distinct 将发射器发出的数据进行去除重复操作

public final Observable<T> distinct() 

5.2.12 filter 将发射器发出的数据按照一定条件过滤出满足条件的数据

public final Observable<T> filter(Predicate<? super T> predicate)

5.2.13 buffer 将发射器发出的数据按照指定的格式(count数组长度,skip数组赋值时,在数据中跳过的位置),分割成数组。

 public final Observable<List<T>> buffer(int count, int skip)

5.2.14 reduce 给定数据对象,针对发射器发出的数据做操作,返回将给定对象返回

public final <R> Single<R> reduce(R seed, BiFunction<R, ? super T, R> reducer)

5.2.15 scan 给定数据对象,针对发射器发出的数据做操作,返回将每一步数据操作结果都返回

5.2.16 delay 将数据流延迟发射给接受者(网络访问,友好显示弹窗)

 public final Observable<T> delay(long delay, TimeUnit unit) 

六: Kotlin代码

package com.xly.netservice.rxjava2

import android.util.Log
import io.reactivex.*
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.functions.BiFunction
import io.reactivex.functions.Function
import io.reactivex.internal.operators.observable.ObservableObserveOn
import io.reactivex.schedulers.Schedulers
import java.util.concurrent.Callable
import java.util.concurrent.TimeUnit

/**
 * 说明:演示Rxjava2操作符 create map zip
 * Created by code_nil on 2017/12/22.
 */
object Rxjava2Demo {
    //region 创建发射器
    //create操作符,创建一个被观察者(发射器)
    fun createDemo() {
        var TAG = "create"
        var sub = Observable.create(object : ObservableOnSubscribe<Int> {
            override fun subscribe(e: ObservableEmitter<Int>) {
                Log.e(TAG, "Observable::send->1")
                e.onNext(1)
                Log.e(TAG, "Observable::send->2")
                e.onNext(2)
                Log.e(TAG, "Observable::send->3")
                e.onNext(3)
                Log.e(TAG, "Observable::send->4")
                e.onNext(4)
            }
        })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(object : Observer<Int> {
                    override fun onError(e: Throwable) {
                        Log.e(TAG, "Observer::receive->onError")
                    }

                    override fun onComplete() {
                        Log.e(TAG, "Observer::receive->onComplete")
                    }

                    override fun onSubscribe(d: Disposable) {
                        Log.e(TAG, "Observer::receive->onSubscribe")
                    }

                    override fun onNext(t: Int) {
                        Log.e(TAG, "Observer::receive->$t")
                    }

                })
    }

    //每次订阅都会创建一个新的Observable,并且如果没有被订阅,就不会产生新的Observable。其他的创建方式都是首先创建出了发射器
    fun deferDemo() {
        var TAG = "defer"
        Observable.defer { Observable.just(1, 2, 3) }.subscribe { Log.e(TAG, "$it") }
    }

    //将A,B事件结果组合起来,组合方式是A1B1 A2B2 ……
    //没有调用了onComplete
    fun zipDemo() {
        var TAG = "zip"
        Observable
                .zip(getZipStringObservabl(), getZipIntObservabl(), object : BiFunction<String, Int, String> {
                    override fun apply(t1: String, t2: Int): String {
                        return "$t1$t2"
                    }
                })
                .subscribe(object : Observer<String> {
                    override fun onError(e: Throwable) {
                        Log.e(TAG, "Observer::receive->onError")
                    }

                    override fun onComplete() {
                        Log.e(TAG, "Observer::receive->onComplete")
                    }

                    override fun onSubscribe(d: Disposable) {
                        Log.e(TAG, "Observer::receive->onSubscribe")
                    }

                    override fun onNext(t: String) {
                        Log.e(TAG, "Observer::receive->$t")
                    }
                })
    }

    //concat操作符,将A,B事件按顺序合并起来,称为一个新的发射器
    //调用了onComplete
    fun concatDemo() {
        var TAG = "concat"
        Observable.concat(Observable.just(1, 2, 3, 4), Observable.just("a", "b"), Observable.just(1, 2, 3, 4), Observable.just("a", "b"))
                .subscribe(object : Observer<Any> {
                    override fun onError(e: Throwable) {
                        Log.e(TAG, "Observer::receive->onError")
                    }

                    override fun onComplete() {
                        Log.e(TAG, "Observer::receive->onComplete")
                    }

                    override fun onSubscribe(d: Disposable) {
                        Log.e(TAG, "Observer::receive->onSubscribe")
                    }

                    override fun onNext(t: Any) {
                        Log.e(TAG, "Observer::receive->$t")
                    }
                })
    }

    //通过调用timer关键字,设置一个定时任务
    fun timerDemo() {
        var TAG = "timer"
        Observable.timer(500, TimeUnit.MILLISECONDS).subscribe(object : Observer<Long> {
            override fun onSubscribe(d: Disposable) {
                Log.e(TAG, "start--->${System.currentTimeMillis()}")
            }

            override fun onError(e: Throwable) {
                Log.e(TAG, "onError")
            }

            override fun onNext(t: Long) {
                Log.e(TAG, "end----->$t--->${System.currentTimeMillis()}")
            }

            override fun onComplete() {
                Log.e(TAG, "onComplete")
            }

        })
    }

    //定时发送,调用interval会产生一个发射者(被观察者),将会定时发送一个数据(从0开始) 倒计时心跳等操作
    fun intervalDemo() {
        var TAG = "interval"
        Observable
                .interval(0, 1000, TimeUnit.MILLISECONDS)
                .subscribe { Log.e(TAG, "$it") }
    }

    //通过调用just关键字,创建一个发射器,发射指定数据
    fun justDemo() {
        var TAG = "just"
        Observable.just(1, 2, 3, 4).subscribe { Log.e(TAG, "$it") }
    }

    //将多个发射器结合起来,与concat不同的是,这里数据发射的先后无法得到保证
    fun mergeDemo() {
        var TAG = "first"
        Observable.merge(getZipStringObservabl(), getZipIntObservabl()).subscribe { Log.e(TAG, "$it") }
    }
    //endregion


    //在数据接收之前执行指定操作,同时不会改变数据源,doOnNext(非关键字)
    fun doOnNextDemo() {
        var TAG = "doOnNext"
        Observable.just(1, 2, 3, 4, 5)
                .doOnNext { Log.e(TAG, "doOnNext--->保存$it") }
                .subscribe(object : Observer<Int> {
                    override fun onSubscribe(d: Disposable) {
                        Log.e(TAG, "receive--->onSubscribe")
                    }

                    override fun onNext(t: Int) {
                        Log.e(TAG, "receive--->$t")
                    }

                    override fun onComplete() {
                        Log.e(TAG, "receive--->onComplete")
                    }

                    override fun onError(e: Throwable) {
                        Log.e(TAG, "receive--->onError")
                    }

                })
    }


    //Single,Single是一个发射器,该发射器只会接收单一参数,同时该方法灭有onnext,但是有onSuccess
    fun singleDemo() {
        var TAG = "Single"
        Single.just(5).subscribe(object : SingleObserver<Int> {
            override fun onSuccess(t: Int) {
                Log.e(TAG, "onSuccess--> $t")
            }

            override fun onError(e: Throwable) {
                Log.e(TAG, "onError--> $e")
            }

            override fun onSubscribe(d: Disposable) {
                Log.e(TAG, "onSubscribe")
            }

        })
    }


    //通过调用take关键字,可以指定接收多少个数据
    fun takeDemo() {
        var TAG = "take"
        Observable.interval(0, 1000, TimeUnit.MILLISECONDS).take(10).subscribe { Log.e(TAG, "$it") }
    }

    //获取末尾的指定数量的数据
    fun takeLastDemo() {
        var TAG = "takeLast"
        Observable.interval(0, 1000, TimeUnit.MILLISECONDS).takeLast(1, TimeUnit.SECONDS).subscribe { Log.e(TAG, "$it") }
    }

    //获取数据的第一个,当数据无法获取到的时候,那么便会发出默认参数值。(同filter连用可以产生)
    fun firstDemo() {
        var TAG = "first"
        Observable.just(1, 2, 3, 4).filter { it > 10 }.first(10).subscribe { t1, t2 -> Log.e(TAG, "$t1----$t2") }
    }

    //获取数据的最后一个,当数据无法获取到的时候,那么便会发出默认参数值。(同filter连用可以产生)
    fun lastDemo() {
        var TAG = "last"
        Observable.just(1, 2, 3, 4).filter { it > 10 }.last(999).subscribe { t1, t2 -> Log.e(TAG, "$t1----$t2") }
    }

    //通过调用skip关键字,每次发送数据都将跳过指定长度
    fun skipDemo() {
        var TAG = "skip"
        Observable.just(1, 2, 3, 4).skip(2).subscribe { Log.e(TAG, "$it") }
    }

    //去除频率过快的操作(RxAndroid的双击UI操作),指定频率,在一个操作之后,指定大于频率才会执行,连续的操作只会执行最后一次
    fun debounceDemo() {
        var TAG = "debounce"
        Observable.create(ObservableOnSubscribe<Int> {
            it.onNext(1)
            Thread.sleep(500)
            it.onNext(2)
            Thread.sleep(500)
            it.onNext(3)
            Thread.sleep(300)
            it.onNext(4)
            Thread.sleep(300)
            it.onNext(5)
        }).debounce(500, TimeUnit.MILLISECONDS).subscribe { Log.e(TAG, "$it") }
    }


    //map操作符,对发射器每次发射的数据执行处理
    //没有调用了onComplete
    fun mapDemo() {
        var TAG = "map"
        var sub = Observable.create(object : ObservableOnSubscribe<Int> {
            override fun subscribe(e: ObservableEmitter<Int>) {
                Log.e(TAG, "Observable::send->1")
                e.onNext(1)
                Log.e(TAG, "Observable::send->2")
                e.onNext(2)
                Log.e(TAG, "Observable::send->3")
                e.onNext(3)
                Log.e(TAG, "Observable::send->4")
                e.onNext(4)
            }
        })
                .map(object : Function<Int, String> {
                    override fun apply(t: Int): String {
                        return "$t"
                    }
                })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(object : Observer<String> {
                    override fun onError(e: Throwable) {
                        Log.e(TAG, "Observer::receive->onError")
                    }

                    override fun onComplete() {
                        Log.e(TAG, "Observer::receive->onComplete")
                    }

                    override fun onSubscribe(d: Disposable) {
                        Log.e(TAG, "Observer::receive->onSubscribe")
                    }

                    override fun onNext(t: String) {
                        Log.e(TAG, "Observer::receive->$t")
                    }

                })
    }

    //通过调用flatMap关键字,可以无序弹出多个被观察者(发射器)
    fun flatMapDemo() {
        var TAG = "flatMap"
        Observable.create(object : ObservableOnSubscribe<Int> {
            override fun subscribe(e: ObservableEmitter<Int>) {
                Log.e(TAG, "Observable::send->1")
                e.onNext(1)
                Log.e(TAG, "Observable::send->2")
                e.onNext(2)
                Log.e(TAG, "Observable::send->3")
                e.onNext(3)
                Log.e(TAG, "Observable::send->4")
                e.onNext(4)
            }
        }).flatMap(object : Function<Int, ObservableSource<String>> {
            override fun apply(t: Int): ObservableSource<String> {
                var list = arrayListOf<String>()
                (0..2).mapTo(list) { "value $t ---- $it" }
                return Observable.fromIterable(list).delay(500, TimeUnit.MILLISECONDS)
            }
        }).subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe {
                    Log.e(TAG, "Observer::receive->$it")
                }
    }

    //通过调用concatMap关键字,可以有序弹出多个被观察者(发射器)
    fun concatMapDemo() {
        var TAG = "concatMap"
        Observable
                .just(1, 2, 3)
                .concatMap {
                    var data = it
                    var list = arrayListOf<Int>()
                    (0..2).mapTo(list) { 10 * it * data }
                    Observable.fromIterable(list).delay(500, TimeUnit.MILLISECONDS)
                }
                .subscribe { Log.e(TAG, "receive--->$it") }
    }

    //通过调用concatMap关键字,可以将发出数据出去重复
    fun distinctDemo() {
        var TAG = "distinct"
        Observable.just(1, 2, 3, 2, 4, 3)
                .distinct()
                .subscribe { Log.e(TAG, "receive--->$it") }
    }

    //通过调用filter关键字,可以将满足指定规则的数据过滤出来
    fun filterDemo() {
        var TAG = "filter"
        Observable.just(1, 2, 3, 4, 4, 3, 2, 1)
                .filter { it > 2 }
                .subscribe { Log.e(TAG, "receive--->$it") }
    }

    //通过调用buffer关键字,将数据按照指定的格式(count数组长度,skip数组赋值时,在数据中跳过的位置),分割成数组。
    fun bufferDemo() {
        var TAG = "buffer"
        Observable.just(1, 2, 3, 4, 5, 6)
                .buffer(2, 1)
                .subscribe { Log.e(TAG, "receive--->$it"); }
    }

    //将数据与传入的初始数据(seed)进行处理,并得出最终结果
    fun reduceDemo() {
        var TAG = "reduce"
        Observable.just(1, 2, 3, 4).reduce(StringBuilder()) { seed, it ->
            seed.append("$it")
        }.subscribe { t1, t2 ->
            Log.e(TAG, "$t1---$t2")
        }
    }

    //将数据与传入的初始数据(seed)进行处理,并发出每一步的处理结果
    fun scanDemo() {
        var TAG = "scan"
        Observable.just(1, 2, 3, 4).scan { t1: Int, t2: Int -> t1 + t2 }.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe { Log.e(TAG, "$it") }
    }

    fun windowDemo() {
        var TAG = "window"
        Observable.just(1, 2, 3, 4, 5, 6, 7).window(3).subscribe {
            it.subscribe { Log.e(TAG, "$it") }
        }
    }

    //first 和 takefirst相同
    private fun getZipStringObservabl() = Observable.create<String> {
        var TAG = "zip"
        Log.e(TAG, "Observable:::send->aaa")
        it.onNext("aaa")
        Log.e(TAG, "Observable:::send->bbb")
        it.onNext("bbb")
        Log.e(TAG, "Observable:::send->ccc")
        it.onNext("ccc")
        Log.e(TAG, "Observable:::send->ddd")
        it.onNext("ddd")
    }

    private fun getZipIntObservabl() = Observable.create<Int> {
        var TAG = "zip"
        Log.e(TAG, "Observable:::send->111")
        it.onNext(111)
        Log.e(TAG, "Observable:::send->222")
        it.onNext(222)
        Log.e(TAG, "Observable:::send->333")
        it.onNext(333)
        Log.e(TAG, "Observable:::send->444")
        it.onNext(444)
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值