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种,对应的订阅者也是固定的,如下:
rxjava的do操作符:
关于冷被观察者和热被观察者:
observable分为cold和hot两种。cold就是多个订阅者不共享被观察者的数据变化。热被观察者的特点是,观察者会按照代码的订阅顺序,依次获得被观察发射的回调。好像所有观察者都在接收广播一样。
- 创建热被观察者的方式
- 通过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();
}
}
- 创建热冷观察者的方式