学过的rxjava(个人总结)

原创 2016年05月30日 22:28:34

资料:

中文:http://rxjava.yuxingxin.com/

https://github.com/mcxiaoke/RxDocs

英语:https://github.com/ReactiveX/RxJava


优点:最大的优点站的点较高,接近自然语言以及去除掉了一下无用的状态

思想:函数式编程

 

基本了解:

基础:

首先懂得生产者Observable和消费者Subscriber,一般生产者生产出来的东西需要消费者进行消费(不管是错误还是正确)(坑爹的csdn,不能从doc复制图片过来,看来还是要去简书了)

简单例子:

Observable.just("hello world")//生产者

.subscribe(newSubscriber<String>() {//消费者
   
@Override
   
public void onCompleted() {
       
    }

   
@Override
   
public void onError(Throwable e) {

    }

   
@Override
   
public void onNext(String s) {

    }
})
;

其中他们互相连接的关系叫做绑定关系。(一般绑定关系会自动结束,但某种情况还是需要手动结束,一般用父类的CompositeSubscription来进行绑定和反绑定)

subscribe方法有一个重载版本,接受三个Action1类型的参数,分别对应OnNextOnComplete OnError函数,如下

myObservable.subscribe(onNextAction,onErrorAction, onCompleteAction);

 

主题:

subject 有4种对应的4个类

http://reactivex.io/documentation/subject.html

这个主题的原理类似于代理,

BehaviorSubject<T> assignSubject = BehaviorSubject.create()
assignSubject.onNext(value);
assignSubject.asObservable().subscribe();

这个类似于发送一个值,然后把值传递给消费者,然后他就会调用消费者了。(因此这个可以当做闭包来使用)

 

线程 :

切换主线程和新线程http://reactivex.io/documentation/scheduler.html

实例一叠,我的基本用法就只用到

.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())

SubcribeOn代表Observable在运行在哪个线程

而ObserveOn则代表他下面的代码运行到哪个线程里

解释:

As shown in this illustration, the SubscribeOn operatordesignates which thread the Observable will begin operating on, no matter atwhat point in the chain of operators that operator is called. ObserveOn, on the other hand, affects the thread that the Observablewill use below where that operator appears. For thisreason, you may call ObserveOn multiple times at various points during thechain of Observable operators in order to change on which threads certain ofthose operators operate.

操作符

创建:

https://github.com/mcxiaoke/RxDocs/blob/master/operators/Creating-Observables.md

我常用的就差不多是create,just和from

先讲just,一般像下面这样就会发生两个信号,则消费者会处理2次,调用onnext 2次,oncomplete 1次

Observable.just("hello world","hello")

所以我一般用下面这种方式,消费者处理一次,调用onnext 1次,oncomplete 1次

Observable.just(url)

 

From的话只允许一个入参

ArrayList<String> one=new ArrayList<>();
one.add("one1");
one.add("one2");
one.add("one3");
one.add("one4");
Observable.from(one)

 

而create不同,他需要自己实现其消费者如何消费的方式。

Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<? super String> subscriber) {
        try{
            subscriber.onNext("haha");
            subscriber.onNext("haha1");
            subscriber.onNext("haha2");
            subscriber.onCompleted();
        }catch (Exception e){
            subscriber.onError(e);
        }
    }
})

基本上就是先调用onnext 3次在调用 oncompleted。(注意点,基本上create需要编写onnext和oncompleted 2个方法最好)

变换操作:

就是把生成者里面的值变成其他的值

https://github.com/mcxiaoke/RxDocs/blob/master/operators/Transforming-Observables.md

我常用的话一般是map,flapmap,和scan,

 

Map例子:从1变成2

Observable.just(1)
        .map(integer -> integer+1)

Flapmap:把一个生成者转换成另一个生产者

Observable.just("")
        .flatMap(integer -> Observable.just(1))
        .map(integer1 -> integer1+"")

Scan:可以理解为前一个消费者的结果和后一个生产的结果合并,并且后一个消费者的结果。

下面的简单来说是初始值为-1,然后依次相加获取的值为0,2,5,9,14,

Observable.just(1, 2, 3, 4, 5)
        .scan(-1,new Func2<Integer, Integer, Integer>() {
            @Override
            public Integer call(Integer sum, Integer item) {
                return sum + item;
            }
        })

 

过滤操作:

https://github.com/mcxiaoke/RxDocs/blob/master/operators/Filtering-Observables.md

类似于if的方式,但是比他强,向filter就是if操作,而且distinct则是去从,

重点讲debounce,这种是按时间发送的,例如一个生产者生产太快了,但是我只是需要1s才获取一个值就可以用debounce。下面这个interval操作是代表每个一次发送一个信号,而debounce则代表我只是要3秒后才往下传。

 

结合操作符:

https://github.com/mcxiaoke/RxDocs/blob/master/operators/Combining-Observables.md

向合并这种东西很经常用,比如你一个业务同时请求2个接口,且2个接口都需要调用一次就可以用zip,或者combineLatest,这2者的区别就在于zip触发的次数要相同才会触发。

Merge和concat的区别在于concat是一个信号链接到另一个信号的完成的后面,就比如有2个信号的内容都是arraylis<String>,下面则one1到 one4,然后 second1到second4.如果是merge则是second先,one后。(有时间差别的时候才区分明显,下面那个例子就是多了一个delay)

ArrayList<String> one=new ArrayList<>();
one.add("one1");
one.add("one2");
one.add("one3");
one.add("one4");
ArrayList<String> second=new ArrayList<>();
second.add("second1");
second.add("second2");
second.add("second3");
second.add("second4");
Observable.concat(Observable.from(one).delay(1, TimeUnit.SECONDS), Observable.from(second))

 

 

错误处理

https://github.com/mcxiaoke/RxDocs/blob/master/operators/Error-Handling-Operators.md

很少用到,除非要错误恢复。

向下面的这个就用到一个操作符retrywhen,运行一下就知道异常恢复后转换成retrywhen里面的生产者

Observable.create((Subscriber<? super String> s) -> {
    System.out.println("subscribing");
    s.onError(new RuntimeException("always fails"));
}).retryWhen(attempts -> {
    return attempts.zipWith(Observable.range(1, 3), (n, i) -> i).flatMap(i -> {
        System.out.println("delay retry by " + i + " second(s)");
        return Observable.timer(i, TimeUnit.SECONDS);
    });
}).toBlocking().forEach(System.out::println);

 

 

条件和boolean

和过滤操作类似,

 

算术和聚合操作 

https://github.com/mcxiaoke/RxDocs/blob/master/operators/Mathematical-and-Aggregate-Operators.md

compile 'io.reactivex:rxjava-math:1.0.0'

首先讲math模块,max最大值,min最小值,

ArrayList<Integer> oneInt=new ArrayList<>();
oneInt.add(11);
oneInt.add(12);
oneInt.add(13);
oneInt.add(14)
MathObservable.max(Observable.from(oneInt))
        .subscribe(System.out::print);

输出则为

聚合操作:

像下面的操作tolist,首先先发送一个arraylist的然后每个进行100操作,在变成列表,也就是说tolist把多个变成一个的操作符。(tomap类似)

ArrayList<Integer> oneInt=new ArrayList<>();
oneInt.add(11);
oneInt.add(12);
oneInt.add(13);
oneInt.add(14);
MathObservable.min(Observable.from(oneInt))
        .subscribe(integer -> System.out.println(integer));
//输出11

而reduce这种就类似于scan,唯一的区别reduce只输出最后一个值

ArrayList<Integer> oneInt=new ArrayList<>();
oneInt.add(11);
oneInt.add(12);
oneInt.add(13);
oneInt.add(14);
Observable.from(oneInt)
        .map(integer -> integer*100)
        .reduce((integer1, integer2) -> integer1+integer2)
//输出5000

 

异步操作 -

compile'com.netflix.rxjava:rxjava-async-util:0.20.7'

暂时没怎么用

 

 Toxxxxx转换操作 

ToFuture/ToList/ToIterable/ToMap/toMultiMap future先不管,其他上面有讲到,基本上和ToList一样

 

Blocking阻塞操作 

https://github.com/mcxiaoke/RxDocs/blob/master/operators/Blocking-Observable-Operators.md

信号这种,我们有时候想直接获取他的值进行显示,则需要阻塞获取

String[] items = new String[] { "one", "two", "three" };
List<String> list=Observable.from(items)
        .map(s -> s + "``")
        .toList().toBlocking().single();
Observable.from(list).subscribe(System.out::print);

当他变成blockingobservable的时候就需要一些特殊操作符,例如first,single等

String 操作符

https://github.com/mcxiaoke/RxDocs/blob/master/operators/String-Observables.md

像String本身提供了非常多的操作,rx也提供了一些简单的操作,见上文

 

进阶:进一步了解

冷热信号

处理副作用

Buffer和window等时间窗口操作符等

自定义操作符:

https://mcxiaoke.gitbooks.io/rxdocs/content/topics/Implementing-Your-Own-Operators.html

使用lift( )compose( )来实现

        

自定义插件:

插件让你可以用多种方式修改RxJava的默认行为:

修改默认的计算、IO和新线程调度器集合

为RxJava可能遇到的特殊错误注册一个错误处理器

注册一个函数记录一些常规RxJava活动的发生

相关文章推荐

深入浅出RxJava三--响应式的好处

原文链接在第一篇中,我介绍了RxJava的基础知识。第二篇中,我向你展示了操作符的强大。但是你可能仍然没被说服。这篇里面,我讲向你展示RxJava的其他的一些好处,相信这篇足够让你去使用Rxjava....
  • lzyzsd
  • lzyzsd
  • 2015年04月05日 21:52
  • 68378

【Android】在Android studio中使用retrol lambda,gradle构建;RxJava使用建议,优缺点

本准备部署RxAndroid,不过问题多多,一个个来,先看java 1.8 新特性,lambda表达式简洁的lambda英文总结 (ps:lambda表达式的中文使用示例)首先,要想在AS中使用la...

RxJava操作符(06-错误处理)

转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51656736 本文出自:【openXu的博客】目录:Catch Retry 源码下载...

android学习之路(三)----RxJava/RxAndroid

RxJava学习一、基础篇 一、概述https://github.com/ReactiveX/RxJava二、基础     RxJava最核心的两个东西是Observables(被观察者,事件源)...

Rxjava和lambda语法

本文大部分代码基于lambdaexpressions写在前面的话本文只讲Lambda语法,不会涉及到API讲解,也不会涉及到RxJava原理介绍。个人感觉Lambda表达式是RxJava的基础,只有明...

RxJava操作符大全

再也不用担心记不住RxJava中的操作符了,RxJava操作符大全,需要用时Ctrl+F一下,还有使用例子哦。...

RxJava学习(二)——RxJava使用场景总结

11个RxJava的实例集合 类名一一对应内容,分别是: MainActivity——RxJava基础用法 simplestAty——RxJava简单实例 timer——延时操作 i...

RxJava错误处理

概述Rxjava中,在错误出现的时候就会调用Subscriber的onError方法将错误分发出去,由Subscriber自己来处理错误。 但是如果每个Subscriber都处理一遍的话,工作量就会...
  • wbwjx
  • wbwjx
  • 2016年05月01日 22:58
  • 3270

[Android开发] RxJava2之路十三-阻塞操作例子Demo

一、阻塞操作符列表BlockingObservable已经在Rxjava2中去掉了,集成到了Observable中。官方说明不同文档: https://github.com/ReactiveX/RxJ...

RxJava2总结之操作详解(二)

目录目录 辅助操作 repeat repeatUntil delay delaySubscription do系列 doOnEach doOnNext doOnSubscribe doOnComple...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:学过的rxjava(个人总结)
举报原因:
原因补充:

(最多只允许输入30个字)