Android开发面试之RxJava,Android高级面试题

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的被观察者,最终通过mapObservableobserver形成订阅关系,而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的区别,下面我通过一个例子来演示他们的区别:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值