Rxjava 過(guò)程分析二(操作符流程)
說(shuō)明
- 主要分析操作符的設(shè)計(jì)流程, 只要關(guān)注主要環(huán)節(jié), 大致流程耿战。
- 由于每個(gè)操作符背后的設(shè)計(jì)基本一致, 所以隨便選出一個(gè)分析即可焊傅。 那我們肯定選最簡(jiǎn)單的 map 啦哈剂陡。
基本使用
Flowable.create(new FlowableOnSubscribe<String>() {
@Override
public void subscribe(FlowableEmitter<String> emitter) throws Exception {
// emitter.onNext("");
// emitter.onError();
// emitter.onComplete();
}
}, BackpressureStrategy.LATEST)
.map(new Function<String, String>() {
@Override
public String apply(String s) throws Exception {
return s;
}
})
.subscribe(new FlowableSubscriber<String>() {
@Override
public void onSubscribe(Subscription s) {
}
@Override
public void onNext(String s) {
}
@Override
public void onError(Throwable t) {
}
@Override
public void onComplete() {
}
});
上面一堆和下面一堆我們?cè)谏弦黄呀?jīng)見(jiàn)過(guò), 我們現(xiàn)在主要關(guān)注與中間那一堆狐胎, 也就是 map 的實(shí)現(xiàn)鸭栖。
引發(fā)的思考
- 操作符是怎么承上啟下連接上游和下游的呢?
- Flowable 經(jīng)過(guò)操作符轉(zhuǎn)換后再進(jìn)行點(diǎn)操作握巢, 還是同一個(gè) Flowable 嗎晕鹊?
源碼分析
public final <R> Flowable<R> map(Function<? super T, ? extends R> mapper) {
return new FlowableMap<T, R>(this, mapper);
}
很簡(jiǎn)答嘛, 新建了一個(gè) FlowableMap 而已, 把當(dāng)前的 Flowable 和 怎么轉(zhuǎn)換的對(duì)象(也就是接口, 提供除去讓用戶怎么實(shí)現(xiàn)怎么轉(zhuǎn)換)傳遞進(jìn)去溅话, 并對(duì)成員變量賦值晓锻。
我們?cè)?map 后去訂閱了下游, 那么有我們上一篇分析的結(jié)果來(lái)開(kāi)飞几, 在訂閱的時(shí)候是調(diào)用了 FlowableMap 的 subscribeActual砚哆。 所以我們看看里面做了什么。
protected void subscribeActual(Subscriber<? super U> s) {
source.subscribe(new MapSubscriber<T, U>(s, mapper));
}
等等這個(gè) source 是什么呢屑墨, 好像在這里又發(fā)生了一次訂閱了對(duì)吧躁锁? 對(duì)的。 這個(gè) source 就是我們?cè)趯?shí)例化 FlowableMap 傳進(jìn)來(lái)的 this, 也就是上一個(gè) Flowable 實(shí)例卵史, 在這里是 FlowableCreate灿里。 什么鬼! 怎么又發(fā)生了一次訂閱呢程腹。 那么好匣吊, 我們?cè)囍シ治鱿拢?我們發(fā)生訂閱后結(jié)合上片文章的分析, 發(fā)生訂閱后寸潦, 會(huì)調(diào)用到 FlowableMap 中的 subscribeActual 最后不管是回調(diào)還是返回色鸳, 肯定是調(diào)用的相應(yīng)的方法如 onNext 等都會(huì)調(diào)用到 這里的 MapSubscriber 里相應(yīng)的方法。 你發(fā)現(xiàn)沒(méi)见转, 這里 MapSubscriber 就變聲了一個(gè)臨時(shí)中間節(jié)點(diǎn)的一個(gè)下游命雀。 那我們這個(gè)中間臨時(shí)下游的 onNext 做了什么事情。
public void onNext(T t) {
U v;
try {
v = mapper.apply(t);
} catch (Throwable ex) {
return;
}
downstream.onNext(v);
}
mapper 就是我們傳入 map 中的接口斩箫, 在這里調(diào)用吏砂, 從上層 Flowable 中拿到的結(jié)果, 通過(guò) map 里的這個(gè) function 接口去回調(diào)給用戶去實(shí)現(xiàn)乘客, 然后把轉(zhuǎn)換后的值拿到直接塞給了最后的下游的 onNext狐血。 你明白了沒(méi), 原理就是這么簡(jiǎn)單易核。 到這里前前后后都連接通了吧匈织!
前面的疑惑問(wèn)題
- 操作符是怎么承上啟下的呢?
沒(méi)一個(gè)操作符返回的都是自己實(shí)現(xiàn)的一個(gè) Flowable牡直, 然后保留了上一層的 Flowable缀匕, 在發(fā)生訂閱時(shí)會(huì)一級(jí)一級(jí)的發(fā)生訂閱, 頂層的 FlowableCreate 調(diào)用的方法碰逸, 會(huì)間接的調(diào)用到了操作符相應(yīng)的方法乡小, 然后操作的相應(yīng)方法除了實(shí)現(xiàn)自己的業(yè)務(wù), 然后把結(jié)果傳給了底層的 Flowable 或者下游饵史。
- Flowable 經(jīng)過(guò)操作符后還是同一個(gè) Flowable 嗎满钟?
很明顯不是