RxJava详解(基于2.X版本)

上节讲到 基于1.X版本的RxJava的详解以及使用

https://blog.csdn.net/weixin_37730482/article/details/68059274

 

由于2.X和1.X变化比较大,所以本章节讲述基于2.X版本的RxJava

 

 

 

一.基本使用 基于2.X版本

 

1.Gradle依赖 RxJava&RxAndroid 版本须一致 即都是2.x版本

implementation 'io.reactivex.rxjava2:rxjava:2.0.1'

implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'

 

 

2.代码

public class MainActivity extends AppCompatActivity {

    private Observer mObserver = null;
    private Observable<String> mObservable = null;
    private Disposable mDisposable;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        createObserverMethod();//创建观察者对象
        createObservableMethod();//创建被观察者对象
        if (null != mObserver && null != mObservable) {
            mObservable.subscribe(mObserver);//完成订阅
        }

    }

    /**
     * 创建 观察者对象
     */

    public void createObserverMethod() {
        mObserver = new Observer() {
            @Override
            public void onSubscribe(Disposable d) {
                if (null == d) {
                    return;
                }
                mDisposable = d;
                Log.d("TAG", "观察者 onSubscribe方法执行!!!断开----:" + mDisposable.isDisposed());
            }

            @Override
            public void onNext(Object value) {
                if (null == value) {
                    return;
                }
                Log.d("TAG", "观察者 onNext方法执行!!!结果:" + value.toString());
            }

            @Override
            public void onError(Throwable e) {
                Log.d("TAG", "观察者 onError方法执行!!!");
            }

            @Override
            public void onComplete() {
                Log.d("TAG", "观察者 onComplete方法执行!!!");
            }
        };
    }

    /**
     * 创建 被观察者对象
     */

    public void createObservableMethod() {
        mObservable = Observable.create(new ObservableOnSubscribe() {
            @Override
            public void subscribe(ObservableEmitter e) throws Exception {
                if (e == null) {
                    return;
                }

                //没有切断与观察者的关联
                if (!e.isDisposed()) {
                    e.onNext("被观察者对象 发出第1波数据......");
                    e.onNext("被观察者对象 发出第2波数据......");
                    e.onNext("被观察者对象 发出第3波数据......");
                    e.onComplete();
                }
            }
        });
    }

    /**
     * onDestroy方法
     */

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (null != mDisposable) {
            Log.d("TAG", "onDestroy方法 执行时是否断开----:" + mDisposable.isDisposed());
            if (!mDisposable.isDisposed()) {//没有断开
                mDisposable.dispose();//断开
                Log.d("TAG", "onDestroy方法 断开订阅");
            }
        }
    }

}

 

 

3. 结果

D/TAG: 观察者 onSubscribe方法执行!!!断开----:false

D/TAG: 观察者 onNext方法执行!!!结果:被观察者对象 发出第1波数据......

D/TAG: 观察者 onNext方法执行!!!结果:被观察者对象 发出第2波数据......

D/TAG: 观察者 onNext方法执行!!!结果:被观察者对象 发出第3波数据......

D/TAG: 观察者 onComplete方法执行!!!

 

 

4.关闭页面

D/TAG: onDestroy方法 执行时是否断开----:true

 

 

5.说明

<1> 观察者和被观察者发生订阅关系后。观察者才可收到被观察者发送的消息

<2> 观察者模式,在适当的时候需要取消订阅。这样可以避免内存泄漏。具体做法。

2.X版本的RxJava发生订阅后会生成Disposable对象。可用此对象取消订阅。但是这种常规方式创建观察者时 退出页面时 onSubscribe对象返回的Disposable对象已自动断开  如上

<3> 可以看出2.X和1.X还是有很多区别的。

   (1) 2.X版本 创建观察者对象只有Observer接口一种方式。

   (2) 2.X版本 观察者重写的方法新加onSubscribe方法。开始采用subscribe连接。此方法可以切断和被观察者的关联

   (3) 2.X版本 观察者重写的方法修改onComplete方法。 1.x:onCompleted方法

   (4) 2.X版本 被观察者的创建还是用create操作符,但是重写的方法修改subscribe方法 1.x:call方法

<3> 2.X版本 增加了被观察者的新实现 Flowable支持背压Backpressure

背压详解:https://blog.csdn.net/weixin_37730482/article/details/78085190

 

 

 

6.源码 

上述可知,这种方式的观察者关闭页面时,onSubscribe对象返回的Disposable对象已自动断开。为什么呢?

原因在于被观察者

 

Create方法创建被观察者

mObservable = Observable.create(new ObservableOnSubscribe() {
   
   ...

}

 

create方法源码

public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
    ObjectHelper.requireNonNull(source, "source is null");
    return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source));
}

ObjectHelper.requireNonNull(source, "source is null");这行代码可以忽略。

return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source));这行代码是重点

 

ObservableCreate<T>类 源码

public final class ObservableCreate<T> extends Observable<T> {

    ...

}

该类中,有onNext方法,onError方法,onComplete方法。

 

onNext方法源码

@Override
public void onNext(T t) {
    if (t == null) {
        onError(new NullPointerException("onNext called with null. Null values are generally not allowed in 2.x operators and sources."));
        return;
    }
    if (!isDisposed()) {
        observer.onNext(t);
    }
}

 

onError方法源码 

public void onError(Throwable t) {
    if (t == null) {
        t = new NullPointerException("onError called with null. Null values are generally not allowed in 2.x operators and sources.");
    }
    if (!isDisposed()) {
        try {
            observer.onError(t);
        } finally {
            dispose();
        }
    } else {
        RxJavaPlugins.onError(t);
    }
}

 

onComplete方法源码

public void onComplete() {
    if (!isDisposed()) {
        try {
            observer.onComplete();
        } finally {
            dispose();
        }
    }
}

 

也就是说,在onError方法和onComplete方法中。都执行了dispose()方法。所以会自动断开

 

 

 

 

 

 

二.观察者和被观察者的订阅方法的几个重载方法使用

 

上述观察者和被观察者发生订阅关系时 代码如下

if (null != mObserver && null != mObservable) {
   mObservable.subscribe(mObserver);//完成订阅
}

即。订阅关系调用的subscribe方法

其实subscribe方法有好几个重载的方法。满足不同的需求。

 

1. 传入Observer接口对象 最常用的 如上   无返回值

public final void subscribe(Observer<? super T> observer) {
    ObjectHelper.requireNonNull(observer, "observer is null");
    try {
        observer = RxJavaPlugins.onSubscribe(this, observer);

        ObjectHelper.requireNonNull(observer, "Plugin returned null Observer");

        subscribeActual(observer);
    } catch (NullPointerException e) { // NOPMD
        throw e;
    } catch (Throwable e) {
        Exceptions.throwIfFatal(e);
        // can't call onError because no way to know if a Disposable has been set or not
        // can't call onSubscribe because the call might have set a Subscription already
        RxJavaPlugins.onError(e);

        NullPointerException npe = new NullPointerException("Actually not, but can't throw other exceptions due to RS");
        npe.initCause(e);
        throw npe;
    }
}

 

 

2.传入Consumer  onNext对象 返回值:Disposable 可用于断开订阅关系   即观察者只监听onNext方法。

public final Disposable subscribe(Consumer<? super T> onNext) {
    return subscribe(onNext, Functions.ERROR_CONSUMER, Functions.EMPTY_ACTION, Functions.emptyConsumer());
}

 

 

3.传入 Consumer  onNext对象+Consumer onError对象 返回值:Disposable 可用于断开订阅关系 即观察者监听onNext方法和onError方法。

public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError) {
    return subscribe(onNext, onError, Functions.EMPTY_ACTION, Functions.emptyConsumer());
}

 

 

4.传入 Consumer  onNext对象+Consumer onError对象+Action onComplete对象 返回值:Disposable 可用于断开订阅关系 即观察者监听onNext方法和onError方法和onComplete方法。相当于Observer接口创建观察者。

public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError,
            Action onComplete) {
    return subscribe(onNext, onError, onComplete, Functions.emptyConsumer());
}

 

 

5.2+3+4重载方法举例

 

代码

package com.example.rxjava20;

import android.os.Bundle;
import android.util.Log;

import androidx.appcompat.app.AppCompatActivity;

import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Action;
import io.reactivex.functions.Consumer;

public class MainActivity extends AppCompatActivity {

    private Observable<String> mObservable = null;
    private Disposable mDisposable;
    private Consumer mNextConsumer;
    private Action mCompleteAction;
    private Consumer<Throwable> mErrorConsumer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        createObserverMethod();//创建观察者对象
        createObservableMethod();//创建被观察者对象
        if (null != mNextConsumer && null != mCompleteAction && null != mErrorConsumer && null != mObservable) {
            mDisposable = mObservable.subscribe(mNextConsumer, mErrorConsumer, mCompleteAction);//完成订阅
        }

    }

    /**
     * 创建 观察者对象
     */

    public void createObserverMethod() {
        mNextConsumer = new Consumer() {
            @Override
            public void accept(Object o) throws Exception {
                if (null == o) {
                    return;
                }
                Log.d("TAG", "观察者 onNext方法执行!!!结果:" + o.toString());
            }
        };

        mErrorConsumer = new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) throws Exception {
                Log.d("TAG", "观察者 onError方法执行!!!");
            }
        };

        mCompleteAction = new Action() {
            @Override
            public void run() throws Exception {
                Log.d("TAG", "观察者 onComplete方法执行!!!");
            }
        };
    }

    /**
     * 创建 被观察者对象
     */

    public void createObservableMethod() {
        mObservable = Observable.create(new ObservableOnSubscribe() {
            @Override
            public void subscribe(ObservableEmitter e) throws Exception {
                if (e == null) {
                    return;
                }

                //没有切断与观察者的关联
                if (!e.isDisposed()) {
                    e.onNext("被观察者对象 发出第1波数据......");
                    e.onNext("被观察者对象 发出第2波数据......");
                    e.onNext("被观察者对象 发出第3波数据......");
                    e.onComplete();
                }
            }
        });
    }

    /**
     * onDestroy方法
     */

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (null != mDisposable) {
            Log.d("TAG", "onDestroy方法 执行时是否断开----:" + mDisposable.isDisposed());
            if (!mDisposable.isDisposed()) {//没有断开
                mDisposable.dispose();//断开
                Log.d("TAG", "onDestroy方法 断开订阅");
            }
        }
    }

}

 

 

结果

D/TAG: 观察者 onNext方法执行!!!结果:被观察者对象 发出第1波数据......

D/TAG: 观察者 onNext方法执行!!!结果:被观察者对象 发出第2波数据......

D/TAG: 观察者 onNext方法执行!!!结果:被观察者对象 发出第3波数据......

D/TAG: 观察者 onComplete方法执行!!!

 

关闭页面

D/TAG: onDestroy方法 执行时是否断开----:true

 

 

说明

<1> 这三个方法结合使用就相当于Observer接口创建观察者。也可以单独使用 比如单独使用onNext对象接收被观察者发送的消息

<2> 关闭页面时订阅产生的 Disposable对象已自动断开  如上。原理上看。

<3> RxJava 2.x 提供了多个函数式接口 ,用于实现简便式的观察者模式。比如 上面用的Action、Consumer等等 具体如下图 

 

 

 

 

 

三.2.X版本取消订阅关系

 

1.X版本的RxJava发生订阅后会生成Subscription对象。可用此对象取消订阅。当有多个订阅关系时,可以使用CompositeSubscription对象统一管理Subscription对象。然后统一取消订阅

 

那么2.X版本如何做呢?因为2.X版本常规 的观察者和被观察者发生订阅关系的方法。

mObservable.subscribe(mObserver);//完成订阅

方法返回值是 void类型 即无返回值。

public final void subscribe(Observer<? super T> observer) {}

这种常规的操作是在观察者对象onSubscribe方法中拿到Disposable对象(自动断开),代码如上。

 

 

多个订阅关系举例代码

package com.example.rxjava20;

import android.os.Bundle;
import android.util.Log;

import androidx.appcompat.app.AppCompatActivity;

import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;

public class MainActivity extends AppCompatActivity {

    private Observable<String> mObservable1 = null;
    private Observable<String> mObservable2 = null;

    private Disposable mDisposable1;
    private Disposable mDisposable2;
    private CompositeDisposable mCompositeDisposable;

    private Consumer mNextConsumer1;
    private Consumer mNextConsumer2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        createObserverMethod1();//创建观察者对象1
        createObservableMethod1();//创建被观察者对象1
        if (null != mNextConsumer1 && null != mObservable1) {
            mDisposable1 = mObservable1.subscribe(mNextConsumer1);//完成订阅
        }

        createObserverMethod2();//创建观察者对象2
        createObservableMethod2();//创建被观察者对象2
        if (null != mNextConsumer2 && null != mObservable2) {
            mDisposable2 = mObservable2.subscribe(mNextConsumer2);//完成订阅
        }

        mCompositeDisposable = new CompositeDisposable();
        mCompositeDisposable.add(mDisposable1);
        mCompositeDisposable.add(mDisposable2);
    }

    /**
     * 创建 观察者对象1
     */

    public void createObserverMethod1() {
        mNextConsumer1 = new Consumer() {
            @Override
            public void accept(Object o) throws Exception {
                if (null == o) {
                    return;
                }
                Log.d("TAG", "观察者对象1 onNext方法执行!!!结果:" + o.toString());
            }
        };
    }

    /**
     * 创建 被观察者对象1
     */

    public void createObservableMethod1() {
        mObservable1 = Observable.create(new ObservableOnSubscribe() {
            @Override
            public void subscribe(ObservableEmitter e) throws Exception {
                if (e == null) {
                    return;
                }

                //没有切断与观察者的关联
                if (!e.isDisposed()) {
                    e.onNext("被观察者对象1 发出第00波数据......");
                    e.onNext("被观察者对象1 发出第11波数据......");
                    e.onNext("被观察者对象1 发出第22波数据......");
                    e.onComplete();
                }
            }
        });
    }

    /**
     * 创建 观察者对象2
     */

    public void createObserverMethod2() {
        mNextConsumer2 = new Consumer() {
            @Override
            public void accept(Object o) throws Exception {
                if (null == o) {
                    return;
                }
                Log.d("TAG", "观察者对象2 onNext方法执行!!!结果:" + o.toString());
            }
        };
    }

    /**
     * 创建 被观察者对象2
     */

    public void createObservableMethod2() {
        mObservable2 = Observable.create(new ObservableOnSubscribe() {
            @Override
            public void subscribe(ObservableEmitter e) throws Exception {
                if (e == null) {
                    return;
                }

                //没有切断与观察者的关联
                if (!e.isDisposed()) {
                    e.onNext("被观察者对象2 发出第33波数据......");
                    e.onNext("被观察者对象2 发出第44波数据......");
                    e.onNext("被观察者对象2 发出第55波数据......");
                    e.onComplete();
                }
            }
        });
    }

    /**
     * onDestroy方法
     */

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (null != mCompositeDisposable) {
            Log.d("TAG", "onDestroy方法 执行时是否断开----:" + mCompositeDisposable.isDisposed());
            if (!mCompositeDisposable.isDisposed()) {//没有断开
                mCompositeDisposable.dispose();//断开
                Log.d("TAG", "onDestroy方法 断开订阅");
            }
        }
    }

}

 

结果

D/TAG: 观察者对象1 onNext方法执行!!!结果:被观察者对象1 发出第00波数据......

D/TAG: 观察者对象1 onNext方法执行!!!结果:被观察者对象1 发出第11波数据......

D/TAG: 观察者对象1 onNext方法执行!!!结果:被观察者对象1 发出第22波数据......



D/TAG: 观察者对象2 onNext方法执行!!!结果:被观察者对象2 发出第33波数据......

D/TAG: 观察者对象2 onNext方法执行!!!结果:被观察者对象2 发出第44波数据......

D/TAG: 观察者对象2 onNext方法执行!!!结果:被观察者对象2 发出第55波数据......

 

关闭页面

D/TAG: onDestroy方法 执行时是否断开----:false

D/TAG: onDestroy方法 断开订阅

 

 

说明

<1> 2.X版本的RxJava。普通的订阅关系(使用Observer接口创建观察者)订阅时无返回值这种方式  当单个订阅关系时,观察者接收消息后自动断开。代码结果如上。

<2> 2.X版本的RxJava。其他订阅关系(使用 Consumer对象或者Action对象)订阅时有返回值。返回值类型Disposable对象。这种方式  当单个订阅关系时,观察者接收消息后自动断开。代码结果如上。

<3> 当有多个订阅关系时,可以使用CompositeDisposable对象统一管理Disposable对象。然后统一取消订阅多个订阅关系时,关闭页面时 没有自动断开 。代码结果如上。

 

 

源码

Disposable接口源码

public interface Disposable {
    /**
     * Dispose the resource, the operation should be idempotent.
     */
    void dispose();

    /**
     * Returns true if this resource has been disposed.
     * @return true if this resource has been disposed
     */
    boolean isDisposed();
}

有两个方法 断开以及是否断开。

 

CompositeDisposable类源码

public final class CompositeDisposable implements Disposable, DisposableContainer {
     
      ...    

}

CompositeDisposable类实现了Disposable接口。

 

添加Disposable对象到CompositeDisposable对象

mCompositeDisposable = new CompositeDisposable();
mCompositeDisposable.add(mDisposable1);
mCompositeDisposable.add(mDisposable2);

add方法源码 

public boolean add(Disposable d) {
    ObjectHelper.requireNonNull(d, "d is null");
    if (!disposed) {
        synchronized (this) {
            if (!disposed) {
                OpenHashSet<Disposable> set = resources;
                if (set == null) {
                    set = new OpenHashSet<Disposable>();
                    resources = set;
                }
                set.add(d);
                return true;
            }
        }
    }
    d.dispose();
    return false;
}

和1.X版本的类似,判断是否断开。没断开的情况下同步方法中声明一个OpenHashSet<Disposable>集合。用来存放各个订阅关系Disposable对象。先后断开Disposable对象。

 

断开订阅

if (!mCompositeDisposable.isDisposed()) {//没有断开
      mCompositeDisposable.dispose();//断开    
}

 

dispose方法源码 

public void dispose() {
    if (disposed) {
        return;
    }
    OpenHashSet<Disposable> set;
    synchronized (this) {
        if (disposed) {
            return;
        }
        disposed = true;
        set = resources;
        resources = null;
    }

    dispose(set);
}

dispose()方法源码 

void dispose(OpenHashSet<Disposable> set) {
    if (set == null) {
        return;
    }
    List<Throwable> errors = null;
    Object[] array = set.keys();
    for (Object o : array) {
        if (o instanceof Disposable) {
            try {
                ((Disposable) o).dispose();
            } catch (Throwable ex) {
                Exceptions.throwIfFatal(ex);
                if (errors == null) {
                    errors = new ArrayList<Throwable>();
                }
                errors.add(ex);
            }
        }
    }
    if (errors != null) {
        if (errors.size() == 1) {
            throw ExceptionHelper.wrapOrThrow(errors.get(0));
        }
        throw new CompositeException(errors);
    }
}

 

即此方法的核心(忽略catch代码块)就是 遍历OpenHashSet<Disposable>集合中存放的单个Disposable对象。然后调用单个Disposable对象的断开的方法。

 

总结:CompositeDisposable对象统一管理Disposable对象。大概的原理就是先将Disposable对象存放在CompositeDisposable对象的Set集合中。统一取消订阅时。再遍历CompositeDisposable对象的Set集合。然后统一取消订阅

 

 

 

 

 

 

 

四.2.X版本 创建被观察者的其他操作符

 

1.create

简介

同上

 

代码

同上

 

结果

同上

 

 

 

2.Just

简介

发送单个数值,和1.X版本一样,它接受一至九个参数,返回一个按参数列表顺序发射这些数据的Observable。

 

代码

package com.example.rxjava20;

import android.os.Bundle;
import android.util.Log;

import androidx.appcompat.app.AppCompatActivity;

import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;

public class MainActivity extends AppCompatActivity {

    private Observer mObserver = null;
    private Observable mObservable = null;
    private Disposable mDisposable;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        createObserverMethod();//创建观察者对象
        createObservableMethod();//创建被观察者对象
        if (null != mObserver && null != mObservable) {
            mObservable.subscribe(mObserver);//完成订阅
        }
    }

    /**
     * 创建 观察者对象
     */

    public void createObserverMethod() {
        mObserver = new Observer() {
            @Override
            public void onSubscribe(Disposable d) {
                if (null == d) {
                    return;
                }
                mDisposable = d;
                Log.d("TAG", "观察者onSubscribe方法执行!!!d.isDisposed()" + d.isDisposed());
            }

            @Override
            public void onNext(Object value) {
                if (null == value) {
                    return;
                }
                Log.d("TAG", "观察者onNext方法执行!!!结果:" + value.toString());
            }

            @Override
            public void onError(Throwable e) {
                Log.d("TAG", "观察者onError方法执行!!!");
            }

            @Override
            public void onComplete() {
                Log.d("TAG", "观察者onComplete方法执行!!!");
            }
        };
    }

    /**
     * 创建 被观察者对象
     */

    public void createObservableMethod() {
        mObservable = Observable.just("1", 2, "张三", 6598);
    }

    /**
     * onDestroy方法
     */

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (null != mDisposable) {
            Log.d("TAG", "onDestroy方法 执行时是否断开----:" + mDisposable.isDisposed());
            if (!mDisposable.isDisposed()) {//没有断开
                mDisposable.dispose();//断开
                Log.d("TAG", "onDestroy方法 断开订阅");
            }
        }
    }

}

 

结果

D/TAG: 观察者onSubscribe方法执行!!!d.isDisposed()false

D/TAG: 观察者onNext方法执行!!!结果:1

D/TAG: 观察者onNext方法执行!!!结果:2

D/TAG: 观察者onNext方法执行!!!结果:张三

D/TAG: 观察者onNext方法执行!!!结果:6598

D/TAG: 观察者onComplete方法执行!!!

 

关闭页面

D/TAG: onDestroy方法 执行时是否断开----:false

D/TAG: onDestroy方法 断开订阅

 

 

 

3.fromArray

简介

发送数组类型的数据,相当于1.X的From方法。

 

代码

package com.example.rxjava20;

import android.os.Bundle;
import android.util.Log;

import androidx.appcompat.app.AppCompatActivity;

import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;

public class MainActivity extends AppCompatActivity {

    private Observer mObserver = null;
    private Observable mObservable = null;
    private Disposable mDisposable;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        createObserverMethod();//创建观察者对象
        createObservableMethod();//创建被观察者对象
        if (null != mObserver && null != mObservable) {
            mObservable.subscribe(mObserver);//完成订阅
        }
    }

    /**
     * 创建 观察者对象
     */

    public void createObserverMethod() {
        mObserver = new Observer() {
            @Override
            public void onSubscribe(Disposable d) {
                if (null == d) {
                    return;
                }
                mDisposable = d;
                Log.d("TAG", "观察者onSubscribe方法执行!!!d.isDisposed()" + d.isDisposed());
            }

            @Override
            public void onNext(Object value) {
                if (null == value) {
                    return;
                }
                Log.d("TAG", "观察者onNext方法执行!!!结果:" + value.toString());
            }

            @Override
            public void onError(Throwable e) {
                Log.d("TAG", "观察者onError方法执行!!!");
            }

            @Override
            public void onComplete() {
                Log.d("TAG", "观察者onComplete方法执行!!!");
            }
        };
    }

    /**
     * 创建 被观察者对象
     */

    public void createObservableMethod() {
        String items[] = {"1", "2", "张三", "6598", "我是数组"};
        mObservable = Observable.fromArray(items);
    }

    /**
     * onDestroy方法
     */

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (null != mDisposable) {
            Log.d("TAG", "onDestroy方法 执行时是否断开----:" + mDisposable.isDisposed());
            if (!mDisposable.isDisposed()) {//没有断开
                mDisposable.dispose();//断开
                Log.d("TAG", "onDestroy方法 断开订阅");
            }
        }
    }

}

 

结果

D/TAG: 观察者onSubscribe方法执行!!!d.isDisposed()false

D/TAG: 观察者onNext方法执行!!!结果:1

D/TAG: 观察者onNext方法执行!!!结果:2

D/TAG: 观察者onNext方法执行!!!结果:张三

D/TAG: 观察者onNext方法执行!!!结果:6598

D/TAG: 观察者onNext方法执行!!!结果:我是数组

D/TAG: 观察者onComplete方法执行!!!

 

关闭页面

D/TAG: onDestroy方法 执行时是否断开----:false

D/TAG: onDestroy方法 断开订阅

 

 

 

4.fromIterable

简介

发送 集合List数据。1.X中无此类型的操作符。

 

代码

package com.example.rxjava20;

import android.os.Bundle;
import android.util.Log;

import androidx.appcompat.app.AppCompatActivity;

import java.util.ArrayList;
import java.util.List;

import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;

public class MainActivity extends AppCompatActivity {

    private Observer mObserver = null;
    private Observable mObservable = null;
    private Disposable mDisposable;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        createObserverMethod();//创建观察者对象
        createObservableMethod();//创建被观察者对象
        if (null != mObserver && null != mObservable) {
            mObservable.subscribe(mObserver);//完成订阅
        }
    }

    /**
     * 创建 观察者对象
     */

    public void createObserverMethod() {
        mObserver = new Observer() {
            @Override
            public void onSubscribe(Disposable d) {
                if (null == d) {
                    return;
                }
                mDisposable = d;
                Log.d("TAG", "观察者onSubscribe方法执行!!!d.isDisposed()" + d.isDisposed());
            }

            @Override
            public void onNext(Object value) {
                if (null == value) {
                    return;
                }
                Log.d("TAG", "观察者onNext方法执行!!!结果:" + value.toString());
            }

            @Override
            public void onError(Throwable e) {
                Log.d("TAG", "观察者onError方法执行!!!");
            }

            @Override
            public void onComplete() {
                Log.d("TAG", "观察者onComplete方法执行!!!");
            }
        };
    }

    /**
     * 创建 被观察者对象
     */

    public void createObservableMethod() {
        List<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("张三");
        list.add("6598");
        list.add("我是集合");
        mObservable = Observable.fromIterable(list);
    }

    /**
     * onDestroy方法
     */

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (null != mDisposable) {
            Log.d("TAG", "onDestroy方法 执行时是否断开----:" + mDisposable.isDisposed());
            if (!mDisposable.isDisposed()) {//没有断开
                mDisposable.dispose();//断开
                Log.d("TAG", "onDestroy方法 断开订阅");
            }
        }
    }

}

 

结果

D/TAG: 观察者onSubscribe方法执行!!!d.isDisposed()false

D/TAG: 观察者onNext方法执行!!!结果:1

D/TAG: 观察者onNext方法执行!!!结果:2

D/TAG: 观察者onNext方法执行!!!结果:张三

D/TAG: 观察者onNext方法执行!!!结果:6598

D/TAG: 观察者onNext方法执行!!!结果:我是集合

D/TAG: 观察者onComplete方法执行!!!

 

关闭页面

D/TAG: onDestroy方法 执行时是否断开----:false

D/TAG: onDestroy方法 断开订阅

 

 

5.timer

简介

快速创建1个被观察者对象。延迟指定时间后,发送Long类型数据。

 

代码

package com.example.rxjava20;

import android.os.Bundle;
import android.util.Log;

import androidx.appcompat.app.AppCompatActivity;

import java.util.concurrent.TimeUnit;

import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;

public class MainActivity extends AppCompatActivity {

    private Observer mObserver = null;
    private Observable mObservable = null;
    private Disposable mDisposable;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        createObserverMethod();//创建观察者对象
        createObservableMethod();//创建被观察者对象
        if (null != mObserver && null != mObservable) {
            mObservable.subscribe(mObserver);//完成订阅
        }
    }

    /**
     * 创建 观察者对象
     */

    public void createObserverMethod() {
        mObserver = new Observer() {
            @Override
            public void onSubscribe(Disposable d) {
                if (null == d) {
                    return;
                }
                mDisposable = d;
                Log.d("TAG", "观察者onSubscribe方法执行!!!d.isDisposed()" + d.isDisposed());
            }

            @Override
            public void onNext(Object value) {
                if (null == value) {
                    return;
                }
                Log.d("TAG", "观察者onNext方法执行!!!结果:" + value.toString());
            }

            @Override
            public void onError(Throwable e) {
                Log.d("TAG", "观察者onError方法执行!!!");
            }

            @Override
            public void onComplete() {
                Log.d("TAG", "观察者onComplete方法执行!!!");
            }
        };
    }

    /**
     * 创建 被观察者对象
     */

    public void createObservableMethod() {
        mObservable = Observable.timer(2, TimeUnit.SECONDS);
        Log.d("TAG", "被观察者对象发送数据");
    }

    /**
     * onDestroy方法
     */

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (null != mDisposable) {
            Log.d("TAG", "onDestroy方法 执行时是否断开----:" + mDisposable.isDisposed());
            if (!mDisposable.isDisposed()) {//没有断开
                mDisposable.dispose();//断开
                Log.d("TAG", "onDestroy方法 断开订阅");
            }
        }
    }

}

 

说明

Observable.timer(2, TimeUnit.SECONDS);
public static Observable<Long> timer(long delay, TimeUnit unit) {}

 

参数1:延时时间 延时XX执行

参数2:延时单位

            SECONDS :秒

            MINUTES:分钟

            HOURS:小时

            ...

 

结果

56:56.872 8512-8512/com.example.mydemo D/TAG: 被观察者对象发送数据

56:56.872 8512-8512/com.example.mydemo D/TAG: 观察者onSubscribe方法执行!!!d.isDisposed()false

56:58.874 8512-8548/com.example.mydemo D/TAG: 观察者onNext方法执行!!!结果:0

56:58.874 8512-8548/com.example.mydemo D/TAG: 观察者onComplete方法执行!!!

 

关闭页面

D/TAG: onDestroy方法 执行时是否断开----:false

D/TAG: onDestroy方法 断开订阅

 

 

6.interval

 

简介

快速创建1个被观察者对象。每隔指定时间 就发送数据。应用场景:间隔X时间请求一次接口

 

代码

package com.example.mydemo.rxjava;

import android.os.Bundle;
import android.util.Log;

import androidx.appcompat.app.AppCompatActivity;

import com.example.mydemo.R;

import java.util.concurrent.TimeUnit;

import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;

public class RxJavaActivity extends AppCompatActivity {

    private Observer mObserver = null;
    private Observable mObservable = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_rxjava);

        createObserverMethod();//创建观察者对象
        createObservableMethod();//创建被观察者对象
        if (null != mObserver && null != mObservable) {
            mObservable.subscribe(mObserver);//完成订阅
        }
    }

    /**
     * 创建 观察者对象
     */

    public void createObserverMethod() {
        mObserver = new Observer() {
            @Override
            public void onSubscribe(Disposable d) {
                if (null == d) {
                    return;
                }
                Log.d("TAG", "观察者onSubscribe方法执行!!!d.isDisposed()" + d.isDisposed());
            }

            @Override
            public void onNext(Object value) {
                if (null == value) {
                    return;
                }
                Log.d("TAG", "观察者onNext方法执行!!!结果:" + value.toString());
            }

            @Override
            public void onError(Throwable e) {
                Log.d("TAG", "观察者onError方法执行!!!");
            }

            @Override
            public void onComplete() {
                Log.d("TAG", "观察者onComplete方法执行!!!");
            }
        };
    }

    /**
     * 创建 被观察者对象
     */

    public void createObservableMethod() {
        mObservable = Observable.interval(3, 1, TimeUnit.SECONDS);
        Log.d("TAG", "被观察者对象发送数据");
    }

}

 

说明

Observable.interval(3, 1, TimeUnit.SECONDS);

参数1:第1次延迟时间

参数2:间隔时间

参数3:时间单位

            SECONDS :秒

            MINUTES:分钟

            HOURS:小时

            ...

 

 

结果 退出Activity 还是会继续发送数据

04:01.223 8986-8986/com.example.mydemo D/TAG: 被观察者对象发送数据

04:01.224 8986-8986/com.example.mydemo D/TAG: 观察者onSubscribe方法执行!!!d.isDisposed()false

04:04.227 8986-9415/com.example.mydemo D/TAG: 观察者onNext方法执行!!!结果:0

04:05.225 8986-9415/com.example.mydemo D/TAG: 观察者onNext方法执行!!!结果:1

04:06.225 8986-9415/com.example.mydemo D/TAG: 观察者onNext方法执行!!!结果:2

04:07.225 8986-9415/com.example.mydemo D/TAG: 观察者onNext方法执行!!!结果:3

04:08.225 8986-9415/com.example.mydemo D/TAG: 观察者onNext方法执行!!!结果:4

04:09.227 8986-9415/com.example.mydemo D/TAG: 观察者onNext方法执行!!!结果:5

04:10.225 8986-9415/com.example.mydemo D/TAG: 观察者onNext方法执行!!!结果:6

04:11.225 8986-9415/com.example.mydemo D/TAG: 观察者onNext方法执行!!!结果:7

04:12.225 8986-9415/com.example.mydemo D/TAG: 观察者onNext方法执行!!!结果:8

 

 

 

7.intervalRange 

 

简介

快速创建1个被观察者对象。每隔指定时间 就发送数据。可指定发送的数据的数量。interval方法的加强版。应用场景:间隔多长时间请求一次接口,一共定义请求几次

 

代码

package com.example.mydemo.rxjava;

import android.os.Bundle;
import android.util.Log;

import androidx.appcompat.app.AppCompatActivity;

import com.example.mydemo.R;

import java.util.concurrent.TimeUnit;

import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;

public class RxJavaActivity extends AppCompatActivity {

    private Observer mObserver = null;
    private Observable mObservable = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_rxjava);

        createObserverMethod();//创建观察者对象
        createObservableMethod();//创建被观察者对象
        if (null != mObserver && null != mObservable) {
            mObservable.subscribe(mObserver);//完成订阅
        }
    }

    /**
     * 创建 观察者对象
     */

    public void createObserverMethod() {
        mObserver = new Observer() {
            @Override
            public void onSubscribe(Disposable d) {
                if (null == d) {
                    return;
                }
                Log.d("TAG", "观察者onSubscribe方法执行!!!d.isDisposed()" + d.isDisposed());
            }

            @Override
            public void onNext(Object value) {
                if (null == value) {
                    return;
                }
                Log.d("TAG", "观察者onNext方法执行!!!结果:" + value.toString());
            }

            @Override
            public void onError(Throwable e) {
                Log.d("TAG", "观察者onError方法执行!!!");
            }

            @Override
            public void onComplete() {
                Log.d("TAG", "观察者onComplete方法执行!!!");
            }
        };
    }

    /**
     * 创建 被观察者对象
     */

    public void createObservableMethod() {
        mObservable = Observable.intervalRange(5, 10, 2, 1, TimeUnit.SECONDS);
        Log.d("TAG", "被观察者对象发送数据");
    }

}

 

说明

Observable.intervalRange(5, 10, 2, 1, TimeUnit.SECONDS);

参数1:开始位置。

参数2:发送数量。

参数3:第1次延迟时间。

参数4:间隔时间。

参数5:时间单位。

            SECONDS :秒

            MINUTES:分钟

            HOURS:小时

            ...

 

 

结果 发送onNext数量为10

13:24.844 9901-9901/com.example.mydemo D/TAG: 被观察者对象发送数据

13:24.845 9901-9901/com.example.mydemo D/TAG: 观察者onSubscribe方法执行!!!d.isDisposed()false

13:26.846 9901-10541/com.example.mydemo D/TAG: 观察者onNext方法执行!!!结果:5

13:27.846 9901-10541/com.example.mydemo D/TAG: 观察者onNext方法执行!!!结果:6

13:28.849 9901-10541/com.example.mydemo D/TAG: 观察者onNext方法执行!!!结果:7

13:29.847 9901-10541/com.example.mydemo D/TAG: 观察者onNext方法执行!!!结果:8

13:30.846 9901-10541/com.example.mydemo D/TAG: 观察者onNext方法执行!!!结果:9

13:31.846 9901-10541/com.example.mydemo D/TAG: 观察者onNext方法执行!!!结果:10

13:32.848 9901-10541/com.example.mydemo D/TAG: 观察者onNext方法执行!!!结果:11

13:33.846 9901-10541/com.example.mydemo D/TAG: 观察者onNext方法执行!!!结果:12

13:34.848 9901-10541/com.example.mydemo D/TAG: 观察者onNext方法执行!!!结果:13

13:35.846 9901-10541/com.example.mydemo D/TAG: 观察者onNext方法执行!!!结果:14

13:35.847 9901-10541/com.example.mydemo D/TAG: 观察者onComplete方法执行!!!

 

 

 

8.range

 

简介

快速创建1个被观察者对象。连续发送可指定范围的数据。

 

代码

package com.example.mydemo.rxjava;

import android.os.Bundle;
import android.util.Log;

import androidx.appcompat.app.AppCompatActivity;

import com.example.mydemo.R;

import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;

public class RxJavaActivity extends AppCompatActivity {

    private Observer mObserver = null;
    private Observable mObservable = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_rxjava);

        createObserverMethod();//创建观察者对象
        createObservableMethod();//创建被观察者对象
        if (null != mObserver && null != mObservable) {
            mObservable.subscribe(mObserver);//完成订阅
        }
    }

    /**
     * 创建 观察者对象
     */

    public void createObserverMethod() {
        mObserver = new Observer() {
            @Override
            public void onSubscribe(Disposable d) {
                if (null == d) {
                    return;
                }
                Log.d("TAG", "观察者onSubscribe方法执行!!!d.isDisposed()" + d.isDisposed());
            }

            @Override
            public void onNext(Object value) {
                if (null == value) {
                    return;
                }
                Log.d("TAG", "观察者onNext方法执行!!!结果:" + value.toString());
            }

            @Override
            public void onError(Throwable e) {
                Log.d("TAG", "观察者onError方法执行!!!");
            }

            @Override
            public void onComplete() {
                Log.d("TAG", "观察者onComplete方法执行!!!");
            }
        };
    }

    /**
     * 创建 被观察者对象
     */

    public void createObservableMethod() {
        mObservable = Observable.range(2, 5);
        Log.d("TAG", "被观察者对象发送数据");
    }

}

 

说明

Observable.range(2, 5);

参数1:开始位置。

参数2:数据量个数。

 

 

结果 2开始 5条数据

D/TAG: 被观察者对象发送数据

D/TAG: 观察者onSubscribe方法执行!!!d.isDisposed()false

D/TAG: 观察者onNext方法执行!!!结果:2

D/TAG: 观察者onNext方法执行!!!结果:3

D/TAG: 观察者onNext方法执行!!!结果:4

D/TAG: 观察者onNext方法执行!!!结果:5

D/TAG: 观察者onNext方法执行!!!结果:6

D/TAG: 观察者onComplete方法执行!!!

 

 

注意:上述的快速创建被观察者的方法,有一定的应用场景。

<1> interval:间隔X时间请求一次接口。

<2> intervalRange:间隔多长时间请求一次接口,一共定义请求几次。

 

 

 

 

 

 

五.总结

2.X版本的RxJava使用总结

<1> 创建观察者只有Observer接口一种实现方式。详解上看。

<2> 创建被观察者可以使用很多的操作符,不只局限于create,just,fromArray,timer 四种操作符。详解上看。

<3> 观察者和被观察者发生订阅关系有几个重载方法。使用某一个重载的方法可以单独使用onNext对象。也可以onNext对象+onComplete对象+onError对象结合使用。相当于使用Observer接口创建观察者 详解上看。

<4> 也是最终要的。2.X版本的RxJava。

    (1) 默认订阅关系无返回值,订阅关系是在观察者的onSubscribe方法中返回的Disposable对象。

    (2) 使用某一个重载的方法可以单独使用onNext对象或者其他组合方式实现订阅关系有返回值Disposable对象。

    (3) 以上两种情况下,如果使用create操作符创建被观察者。无论是onSubscribe方法中返回的Disposable对象还是订阅关系时返回的Disposable对象。订阅关系都会自动断开,不需要手动维护。

                                      如果使用其他的操作符创建被观察者(比如Just操作符) 无论是onSubscribe方法中返回的Disposable对象还是订阅关系时返回的Disposable对象。订阅关系都会不会自动断开,需要手动维护。

    (4) 多个订阅关系时,没有自动断开。

    (5) 具体详解 如上。

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值