if (!isDisposed()) {
try {
observer.onComplete();
} finally {
dispose();
}
}
}
这是发射器中onComplete
的定义,dispose
方法是控制是否还能发送数据,其实这里的 CreateEmitter
它是一个AtomicReference<Disposable>
原子类包装Disposable的实现类,而我们dispose
方法正是将该原子类添加了常量的DISPOSED
,而在onNext方法中通过判断isDisposed
是否为false才能继续发送数据。而isDisposed
什么时候为false呢?当AtomicReference<Disposable>
中的包装对象不是DISPOSED
。所以我们的onComplete
是用来控制不能发送数据的。
您可以通过如下代码测试:
emitter.onNext(1);
emitter.onNext(2);
emitter.onComplete();
emitter.onNext(3);
看看下游的observer是否还能收到3的数据。
小总结
onComplete
是用来控制不能发送数据的,也就是不能onNext
了,包括onError也是不能再发送onNext
数据了,该方法中也是调用了dispose
方法。
RxJava中map、flatMap的区别,你还用过其他哪些操作符?
map和flatMap是我们经常用的转换操作,我们先看看map如何使用:
Observable createObservable = Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(@NonNull ObservableEmitter emitter) throws Throwable {
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
emitter.onComplete();
}
});
Observable mapObservable = createObservable.map(new Function<Integer, String>() {
@Override
public String apply(Integer integer) throws Throwable {
return String.valueOf(integer + 1);
}
});
Observer observer = new Observer() {
@Override
public void onSubscribe(@NonNull Disposable d) {
Log.d(TAG, “onSubscribe:” + d.getClass().getName());
}
@Override
public void onNext(@NonNull String string) {
Log.d(TAG, "onNext: " + string);
}
@Override
public void onError(@NonNull Throwable e) {
Log.d(TAG, "onError: " + e.getMessage());
}
@Override
public void onComplete() {
Log.d(TAG, “onComplete”);
}
};
mapObservable.subscribe(observer);
}
通过createObservable
的map操作生成了一个mapObservable
的被观察者,最终通过mapObservable
与observer
形成订阅关系,而map操作需要一个Function的接口,第一个泛型是入参类型,第二个泛型是出参的类型,也就是apply的返回值,这里定义map的出参类型是String类型。 我们再来看下flatMap如何使用:
Observable flatMapObservable = mapObservable.flatMap(new Function<String, ObservableSource>() {
@Override
public ObservableSource apply(String s) throws Throwable {
return Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(@NonNull ObservableEmitter emitter) throws Throwable {
emitter.onNext(Integer.valueOf(s)+1);
emitter.onComplete();
}
});
}
});
flatMapObservable.subscribe(observer);
在上面的mapObservable基础上通过flatMap返回flatMapObservable,最后通过flatMapObservable订阅observer。flatMap的Function第二个泛型是ObservableSource类型的,Observable的父类是ObservableSource类型,因此第二个参数返回Observable也可以。
从上面可以看出map是通过原始数据类型返回另外一种数据类型,而flatMap是通过原始数据类型返回另外一种被观察者。
关于面试也有问flatMap和concatMap的区别,下面我通过一个例子来演示他们的区别: