RxJava入门之路

Posted 懒,是向前迈进的最大障碍! --沃.兹基朔德

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RxJava入门之路相关的知识,希望对你有一定的参考价值。

RxJava接触过蛮长时间了,但是让我说个所以然来还是说不出来,归根结底还是还是理解不够深刻,趁着年底这个时候争取写个系列出来给自己的学习做个记录

注意区分RxJava1.0和2.0的区别,以下默认是在2.0的基础上做的测试

先来理解几个概念:

1、Observable : 字面意思可观察的,被观察者,也就是事件的发生者

2、Observer:观察者,也就是事件的接受者

3、subscribe():两者产生订阅关系,需要注意一点的是 observable.subscribe(observer),感觉像是被观察者订阅了观察者,与常理不符,为什么这么设计呢?我估计是为了链式调用吧。。

一、最简单的使用方式:

 1  Observable.create(new ObservableOnSubscribe<Integer>() {
 2        @Override
 3        public void subscribe(ObservableEmitter<Integer> e) throws Exception {
 4                     e.onNext(1);
 5                     e.onNext(2);
 6                     e.onNext(3);
 7                     e.onComplete();
 8        }
 9        }).subscribe(new Observer<Integer>() {
10 
11                     @Override
12                     public void onSubscribe(Disposable d) {
13                         Log.i(TAG, "onSubscribe: ");
14                     }
15 
16                     @Override
17                     public void onNext(Integer integer) {
18                         Log.i(TAG, "onNext: "+integer);
19                     }
20 
21                     @Override
22                     public void onError(Throwable e) {
23                         Log.i(TAG, "onError: "+e.getMessage());
24                     }
25 
26                     @Override
27                     public void onComplete() {
28                         Log.i(TAG, "onComplete: complete");
29                     }
30   });

  1、onNext()可以多次发送事件,onComplete()发送一次,多次调用不会报错,onError()发送一次,多次调用会报错,不可和onComplete()共存

  2、调用onComplete()或者onError()后,观察者也无法接受到onNext()

  3、Disposable(2.0新增),当调用了dispose()后,观察者就无法接受到事件了

二、Cold Observable和Hot Observable

  Cold Observable:只有当订阅者订阅的时候,数据流才开始发送,并且每个订阅者订阅的时候都会独立执行一遍数据流的发送(create(),just()....)

  Hot Observable :不管有没有订阅者订阅,一旦创建,就开始发送数据流

  publish转化:

1  ConnectableObservable<Long> ob=  Observable.interval(200, TimeUnit.MILLISECONDS).publish();//转化成Cold Observable
2  ob.connect();//开始发送数据流

  如果不调用connnect(),不会发送数据流,一旦调用,就会创建一个subscription并订阅到原Observable,将接受的数据转发给订阅者。

  connect()与disConnect()

  1.0 connect() 返回Subscription

  2.0 connect() 返回Disposable

    //注意区分要释放哪个
    //释放s,则代表中断数据传输,再次连接则重新发送数据
    //释放d1或者d2,则代表取消注册,数据已然在传输
    public  void doSubscribe(View v){
        s= ob.connect(); 
      //public final void subscribe(Observer<? super T> observer) {} 无返回值,无法取消注册
      d1=  ob.subscribe(new Consumer<Long>() {
           @Override
           public void accept(Long aLong) throws Exception {
               Log.i(TAG, "onNext: first============"+aLong);
           }
       });
        d2=ob.subscribe(new Consumer<Long>() {
            @Override
            public void accept(Long aLong) throws Exception {
                Log.i(TAG, "accept: second=========="+aLong);
            }
        });
    }

  RefCount

 Observable<Long> ob=  Observable.interval(200, TimeUnit.MILLISECONDS).publish().refCount();

  如果有订阅者就会发送数据流,无订阅数据流即停止,再次订阅重新开始发送(可能会和Cold Observable混淆,注意此处每个订阅者接受到的数据是相同的)

  Reply

 ConnectableObservable<Long> ob=  Observable.interval(200, TimeUnit.MILLISECONDS).replay();
 ob.connect();

  当和源 Observable 链接后,开始收集数据。当有 Observer 订阅的时候,就把收集到的数据线发给 Observer。然后和其他 Observer 同时接受数据

  可以同时设置收集数据的个数及时间

  Cache

Observable<Long> ob=  Observable.interval(200, TimeUnit.MILLISECONDS).take(5).cache();//只有当订阅者订阅后才开始发送数据

  与Reply类似,订阅者全部取消后也不会停止发送。

以上是关于RxJava入门之路的主要内容,如果未能解决你的问题,请参考以下文章

如何取消订阅RxKotlin / RxJava中的Flowable?

知识整理这可能是最好的RxJava 2.x 入门教程

史上最浅显易懂的RxJava入门教程

这可能是最好的RxJava 2.x 入门教程

知识整理这可能是最好的RxJava 2.x 入门教程

知识整理这可能是最好的RxJava 2.x 入门教程