RxJava源码分析(二):常用操作符
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了RxJava源码分析(二):常用操作符,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3413字,纯文字阅读大概需要5分钟。
内容图文
![RxJava源码分析(二):常用操作符](/upload/InfoBanner/zyjiaocheng/854/0a9d96868ed7406ea0553f1034dd8b40.jpg)
一、map操作符
map操作符的作用是将被观察者Observable发送的数据在apply()方法中转化成自己需要的返回到下游Observer的onNext()方法中。例:
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
emitter.onNext(4);
emitter.onComplete();
}
}).map(new Function<Integer, String>() {
@Override
public String apply(Integer s) throws Exception {
if (s > 2) {
return "aaa";
}
return "bbb";
}
}).subscribe(new Observer<String>() {
...
@Override
public void onNext(String s) {
Log.e("==============", "===onNext==>" + s);
}
...
});
map操作符将Observable发送的Integer类型参数1、2、3、4通过条件判断转化成"aaa"、”bbb"返回到Observer的onNext()方法中。
先来看一下map()方法的源码:
@CheckReturnValue
@SchedulerSupport(SchedulerSupport.NONE)
public final <R> Observable<R> map(Function<? super T, ? extends R> mapper) {
ObjectHelper.requireNonNull(mapper, "mapper is null");
return RxJavaPlugins.onAssembly(new ObservableMap<T, R>(this, mapper));
}
RxJavaPlugins.onAssembly()是hook,这里不管,只看ObservableMap,ObservableMap是Observable的子类,所以他就是我们返回得到的Observable
public final class ObservableMap<T, U> extends AbstractObservableWithUpstream<T, U> {
//保存Function对象
final Function<? super T, ? extends U> function;
public ObservableMap(ObservableSource<T> source, Function<? super T, ? extends U> function) {
//通过super调用父类的构造方法保存传进来的Observable对象
super(source);
this.function = function;
}
@Override
public void subscribeActual(Observer<? super U> t) {
source.subscribe(new MapObserver<T, U>(t, function));
}
static final class MapObserver<T, U> extends BasicFuseableObserver<T, U> {
//保存Function对象
final Function<? super T, ? extends U> mapper;
MapObserver(Observer<? super U> actual, Function<? super T, ? extends U> mapper) {
//通过super调用父类的构造函数保存MapObserver对象,即Observer对象
super(actual);
this.mapper = mapper;
}
@Override
public void onNext(T t) {
...
U v;
try {
v = ObjectHelper.requireNonNull(mapper.apply(t), "The mapper function returned a null value.");
} catch (Throwable ex) {
fail(ex);
return;
}
downstream.onNext(v);
}
...
}
}
- ObservableMap<T, U>继承AbstractObservableWithUpstream<T,U>,ObservableMap<T, U>构造函数传进来的Observable对象保存在AbstractObservableWithUpstream<T,U>中。(ObservableSource是Observable的顶层接口,所有的Observable都实现了ObservableSource)
- 调用map()方法返回Observable订阅Observer时,调用subscribe()由上一节可知会调用subscribeActual()方法,这里调用的ObservableMap中的subscribeActual()方法:
@Override
public void subscribeActual(Observer<? super U> t) {
source.subscribe(new MapObserver<T, U>(t, function));
}
- 在subscribeActual()方法中会创建MapObserver对象订阅上游的Observable对象。
- 在MapObserver中,上游Observable发送的数据会传递到MapObserver的onNext方法中,function会调用apply()方法将上游需要的数据传递进去返回下游观察者所需要的数据,下游Observer调用onNext方法将apply()的返回值传进去。
@Override
public void onNext(T t) {
if (done) {
return;
}
if (sourceMode != NONE) {
downstream.onNext(null);
return;
}
U v;
try {
v = ObjectHelper.requireNonNull(mapper.apply(t), "The mapper function returned a null value.");
} catch (Throwable ex) {
fail(ex);
return;
}
downstream.onNext(v);
}
订阅流程总结:
- Observer订阅了map返回的MapObservable。
- 在MapObservable被订阅时会创建一个MapObserver用来订阅上游的Observable。
- 在MapObserver中,Function通过apply()方法将上游传来的参数转化后传递到下游的观察者。
内容总结
以上是互联网集市为您收集整理的RxJava源码分析(二):常用操作符全部内容,希望文章能够帮你解决RxJava源码分析(二):常用操作符所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。