美文网首页
Rxjava总结

Rxjava总结

作者: elva_2e24 | 来源:发表于2017-12-01 09:55 被阅读0次

    最近看了Rxjava的相关知识点,现在总结一下以备之后查看。

    Rxjava比较重要的就是操作符:

    http://blog.csdn.net/maplejaw_/article/details/52396175

    创建操作的操作符有:

    Create   Just   From   Defer 

    Empty/Never/Throw

    Interval   Range   Repeat   Start   Timer

    create使用OnSubscribe从头创建一个Observable,这种方法比较简单。需要注意的是,使用该方法创建时,建议在OnSubscribe#call方法中检查订阅状态,以便及时停止发射数据或者运算。

    from: 将一个Iterable, 一个Future, 或者一个数组,内部通过代理的方式转换成一个Observable。Future转换为OnSubscribe是通过OnSubscribeToObservableFuture进行的,Iterable转换通过OnSubscribeFromIterable进行。数组通过OnSubscribeFromArray转换。

    just: 将一个或多个对象转换成发射这个或这些对象的一个Observable。如果是单个对象,内部创建的是ScalarSynchronousObservable对象。如果是多个对象,则是调用了from方法创建。

    empty: 创建一个什么都不做直接通知完成的Observable

    error: 创建一个什么都不做直接通知错误的Observable

    never: 创建一个什么都不做的Observable

    defer: 只有当订阅者订阅才创建Observable,为每个订阅创建一个新的Observable。内部通过OnSubscribeDefer在订阅时调用Func0创建Observable。

    interval: 创建一个按照给定的时间间隔发射从0开始的整数序列的Observable,内部通过OnSubscribeTimerPeriodically工作。

    Observable.interval(1, TimeUnit.SECONDS).subscribe(newAction1() {

      @Override

      public void call(Long aLong) {//每隔1秒发送数据项,从0开始计数//0,1,2,3....}

    });

    range: 创建一个发射指定范围的整数序列的Observable

    timer: 创建一个在给定的延时之后发射数据项为0的Observable,内部通过OnSubscribeTimerOnce工作

    转换操作的操作符有:

    Map   FlatMap   GroupBy  Buffer  Scan   Window 


    过滤操作的操作符有:

    Debounce   Distinct   ElementAt   Filter   Take   Takelast   

    First   IgnoreElements   Last   Sample   Skip   SkipLast

    filter: 过滤数据。内部通过OnSubscribeFilter过滤数据。

    Observable.just(3,4,5,6) .filter(newFunc1() {

    @Override

    public Boolean call(Integer integer) {

        return integer>4;               

     }           

     }) .subscribe(item->Log.d("JG",item.toString()));//5,6

    ofType: 过滤指定类型的数据,与filter类似,

    Observable.just(1,2,"3").ofType(Integer.class) .subscribe(item -> Log.d("JG",item.toString()));

    take: 只发射开始的N项数据或者一定时间内的数据。内部通过OperatorTake和OperatorTakeTimed过滤数据。

    Observable.just(3,4,5,6)            .take(3)//发射前三个数据项.take(100, TimeUnit.MILLISECONDS)//发射100ms内的数据

    takeLast: 只发射最后的N项数据或者一定时间内的数据。内部通过OperatorTakeLast和OperatorTakeLastTimed过滤数据。takeLastBuffer和takeLast类似,不同点在于takeLastBuffer会收集成List后发射。

    Observable.just(3,4,5,6) .takeLast(3) .subscribe(integer -> Log.d("JG",integer.toString()));//4,5,6

    takeFirst:提取满足条件的第一项。内部实现源码如下:

    publicfinalObservabletakeFirst(Func1 predicate) {returnfilter(predicate).take(1);//先过滤,后提取}

    first/firstOrDefault:只发射第一项(或者满足某个条件的第一项)数据,可以指定默认值。

    Observable.just(3,4,5,6) .first() .subscribe(integer -> Log.d("JG",integer.toString()));//3Observable.just(3,4,5,6)              .first(newFunc1() {@OverridepublicBooleancall(Integer integer) {returninteger>3;                  }              }) .subscribe(integer -> Log.d("JG",integer.toString()));//4

    last/lastOrDefault:只发射最后一项(或者满足某个条件的最后一项)数据,可以指定默认值。

    skip:跳过开始的N项数据或者一定时间内的数据。内部通过OperatorSkip和OperatorSkipTimed实现过滤。

    skipLast:跳过最后的N项数据或者一定时间内的数据。内部通过OperatorSkipLast和OperatorSkipLastTimed实现过滤。

    elementAt/elementAtOrDefault:发射某一项数据,如果超过了范围可以的指定默认值。内部通过OperatorElementAt过滤。

    Observable.just(3,4,5,6)                .elementAt(2)        .subscribe(item->Log.d("JG",item.toString()));//5

    ignoreElements:丢弃所有数据,只发射错误或正常终止的通知。内部通过OperatorIgnoreElements实现。

    distinct:过滤重复数据,内部通过OperatorDistinct实现。

    Observable.just(3,4,5,6,3,3,4,9)      .distinct()      .subscribe(item->Log.d("JG",item.toString()));//3,4,5,6,9

    distinctUntilChanged:过滤掉连续重复的数据。内部通过OperatorDistinctUntilChanged实现

    Observable.just(3,4,5,6,3,3,4,9)      .distinctUntilChanged()      .subscribe(item->Log.d("JG",item.toString()));//3,4,5,6,3,4,9

    throttleFirst:定期发射Observable发射的第一项数据。内部通过OperatorThrottleFirst实现。

    throttleWithTimeout/debounce:发射数据时,如果两次数据的发射间隔小于指定时间,就会丢弃前一次的数据,直到指定时间内都没有新数据发射时

    sample/throttleLast:定期发射Observable最近的数据。内部通过OperatorSampleWithTime实现。

    timeout: 如果原始Observable过了指定的一段时长没有发射任何数据,就发射一个异常或者使用备用的Observable。

    组合操作的操作符有:

    Zip   Merge   StartWith   CombinLastest   Join   SwitchOnNext   

    concat: 按顺序连接多个Observables。需要注意的是Observable.concat(a,b)等价于a.concatWith(b)。

    startWith: 在数据序列的开头增加一项数据。startWith的内部也是调用了concat

    merge: 将多个Observable合并为一个。不同于concat,merge不是按照添加顺序连接,而是按照时间线来连接。其中mergeDelayError将异常延迟到其它没有错误的Observable发送完毕后才发射。而merge则是一遇到异常将停止发射数据,发送onError通知。

    zip: 使用一个函数组合多个Observable发射的数据集合,然后再发射这个结果。如果多个Observable发射的数据量不一样,则以最少的Observable为标准进行压合。内部通过OperatorZip进行压合。

    zip工作流程

    combineLatest: 。当两个Observables中的任何一个发射了一个数据时,通过一个指定的函数组合每个Observable发射的最新数据(一共两个数据),然后发射这个函数的结果。类似于zip,但是,不同的是zip只有在每个Observable都发射了数据才工作,而combineLatest任何一个发射了数据都可以工作,每次与另一个Observable最近的数据压合。具体请看下面流程图。

    combineLatest工作流程

    错误处理的操作符有:

    Catch   Retry  

    相关文章

      网友评论

          本文标题:Rxjava总结

          本文链接:https://www.haomeiwen.com/subject/bkfhvxtx.html