RxJava one :创建和Observable基础

92 阅读2分钟

Rxjava的创建和订阅的最简单方式

/**
 * 最推荐的方式,简单明了,rxjava 2.0推荐方式
 */
Observable.just("hello world").subscribe(new Observer<String>() {
    @Override
    public void onSubscribe(@NonNull Disposable d) {
        System.out.println("subscribe");
    }

    @Override
    public void onNext(@NonNull String s) {
        System.out.println(s);
    }

    @Override
    public void onError(@NonNull Throwable e) {
        System.out.println(e.getMessage());
    }

    @Override
    public void onComplete() {
        System.out.println("onComplete()");
    }
});

关于Observable,共有5种,对应的订阅者也是固定的,如下:

5种观察者模式.png

rxjava的do操作符:

image.png

关于冷被观察者和热被观察者:

observable分为cold和hot两种。cold就是多个订阅者不共享被观察者的数据变化。热被观察者的特点是,观察者会按照代码的订阅顺序,依次获得被观察发射的回调。好像所有观察者都在接收广播一样。

  1. 创建热被观察者的方式
  • 通过publish转换为ConnectableObservable
@Test
public void observableTest() {
    Consumer<Long> subscriber1 = new Consumer<Long>() {
        @Override
        public void accept(Long aLong) throws Throwable {
            System.out.println("subscriber1:"+aLong);
        }
    };

    Consumer<Long> subscriber2 = new Consumer<Long>() {
        @Override
        public void accept(Long aLong) throws Throwable {
            System.out.println("    subscriber2:"+aLong);
        }
    };

    Consumer<Long> subscriber3 = new Consumer<Long>() {
        @Override
        public void accept(Long aLong) throws Throwable {
            System.out.println("       subscriber3:"+aLong);
        }
    };

    ConnectableObservable<Long> observable = Observable.create(new ObservableOnSubscribe<Long>() {
        @Override
        public void subscribe(@NonNull ObservableEmitter<Long> emitter) throws Exception {
            Observable.interval(10, TimeUnit.MILLISECONDS,Schedulers.computation())
                    .take(Integer.MAX_VALUE)
                    .subscribe(emitter::onNext);
        }
    }).observeOn(Schedulers.newThread()).publish();
    observable.connect();

    observable.subscribe(subscriber1);
    observable.subscribe(subscriber2);

    try {
        Thread.sleep(20L);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    observable.subscribe(subscriber3);

    try {
        Thread.sleep(100);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

}

打印的日志结果如下:

com.mobile.rxjava.ExampleUnitTest,observableTest
subscriber1:0
    subscriber2:0
subscriber1:1
    subscriber2:1
subscriber1:2
    subscriber2:2
       subscriber3:2
subscriber1:3
    subscriber2:3
       subscriber3:3
subscriber1:4
    subscriber2:4
       subscriber3:4
subscriber1:5
    subscriber2:5
       subscriber3:5
subscriber1:6
    subscriber2:6
       subscriber3:6
subscriber1:7
    subscriber2:7
       subscriber3:7
subscriber1:8
    subscriber2:8
       subscriber3:8
subscriber1:9
    subscriber2:9
       subscriber3:9
subscriber1:10
    subscriber2:10
       subscriber3:10
subscriber1:11
    subscriber2:11
       subscriber3:11

Process finished with exit code 0

可见,多个观察者在共享同一个事件。这里,ConnectableObservable是线程安全的。通过publish后,转化cold observable为hot obvervable。

  • 通过Subject转换cold Observable为Hot Observable:

因为subject可以作为观察者,订阅目标Cold Observable,使对方开始发送时间。同时又作为Observable转发或者发送新的时间,让Cold Observable借助Subject转换为Hot Observable。 Subject并不是线程安全的。

@Test
public void normalObservableTest() {
    Consumer<Long> subscriber1 = new Consumer<Long>() {
        @Override
        public void accept(Long aLong) throws Throwable {
            System.out.println("subscriber1:"+aLong);
        }
    };

    Consumer<Long> subscriber2 = new Consumer<Long>() {
        @Override
        public void accept(Long aLong) throws Throwable {
            System.out.println("    subscriber2:"+aLong);
        }
    };

    Consumer<Long> subscriber3 = new Consumer<Long>() {
        @Override
        public void accept(Long aLong) throws Throwable {
            System.out.println("       subscriber3:"+aLong);
        }
    };

    Observable<Long> observable = Observable.create(new ObservableOnSubscribe<Long>() {
        @Override
        public void subscribe(@NonNull ObservableEmitter<Long> emitter) throws Exception {
            Observable.interval(10, TimeUnit.MILLISECONDS,Schedulers.computation())
                    .take(Integer.MAX_VALUE)
                    .subscribe(emitter::onNext);
        }
    }).observeOn(Schedulers.computation());

    PublishSubject<Long> objectPublishSubject = PublishSubject.create();
    observable.subscribe(objectPublishSubject);
    objectPublishSubject.subscribe(subscriber1);
    objectPublishSubject.subscribe(subscriber2);

    try {
        Thread.sleep(20L);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    objectPublishSubject.subscribe(subscriber3);

    try {
        Thread.sleep(100);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

}
  1. 创建热冷观察者的方式