Rxjava - flapMap变换

20 篇文章 0 订阅
6 篇文章 0 订阅
Rxjava是一个异步框架,类似于AsyncTask,其优点在于让你的异步代码更简洁,阅读代码会更轻松。知己知彼,百战不殆。
我们从源码分析Rxjava原理,可以让我们更轻松的使用Rxjava,最主要还能学到Rxjava响应式编程的思想。

照例,先来个小例子:

Observable<String> originObservable = Observable.just("1", "2", "3");
Observable<Integer> flapMapObservable = originObservable.flatMap(new Func1<String, Observable<Integer>>() {
    @Override
    public Observable<Integer> call(final String s) {
        return Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                Integer.parseInt(s);
            }
        });
    }
});
Observer<Integer> originObserver = new Observer<Integer>() {
    @Override
    public void onCompleted() {
        Log.e(getClass().getName(), "observer is completed");
    }
    @Override
    public void onError(Throwable e) {
        Log.e(getClass().getName(), "observer is error");
    }
    @Override
    public void onNext(Integer s) {
        Log.e(getClass().getName(), "observer next value : " + s);
    }
};
flapMapObservable.subscribe(originObserver);

flatMap主要的作用是通过Func1

Observable<T> ----------------> Observable<R>

先看看flatMap方法:

// Observable类
public final <R> Observable<R> flatMap(Func1<? super T, ? extends Observable<? extends R>> func) {
    if (getClass() == ScalarSynchronousObservable.class) {
        return ((ScalarSynchronousObservable<T>)this).scalarFlatMap(func);
    }
    return merge(map(func));
}

先调用map方法(请参考map变换),结果是:

// 调用map(func),其中func属于Func1<? super T, ? extends Observable<? extends R>>类型
Observable<T> ----------------> Observable<Observable<R>>(暂且称为TempObservable)

然后调用了merge方法:

// Observable类
public static <T> Observable<T> merge(Observable<? extends Observable<? extends T>> source) {
    if (source.getClass() == ScalarSynchronousObservable.class) {
        return ((ScalarSynchronousObservable<T>)source).scalarFlatMap((Func1)UtilityFunctions.identity());
    }
    return source.lift(OperatorMerge.<T>instance(false));
}

OperatorMerge之后再分析,最终调用了TempObservable的lift方法:

// Observable类
public final <R> Observable<R> lift(final Operator<? extends R, ? super T> operator) {
    return unsafeCreate(new OnSubscribeLift<T, R>(onSubscribe, operator));
}

创建了一个新的被观察者(也就是例子中的flapMapObservable),当我们调用

flapMapObservable.subscribe(originObserver);

那么OnSubscribeLift的call方法便会执行:

// OnSubscribeLift类
public final class OnSubscribeLift<T, R> implements OnSubscribe<R> {
    final OnSubscribe<T> parent;
    final Operator<? extends R, ? super T> operator;
    public OnSubscribeLift(OnSubscribe<T> parent, Operator<? extends R, ? super T> operator) {
        this.parent = parent;
        // 结合上面,这时的operator是OperatorMerge.<T>instance(false)
        this.operator = operator;
    }
    @Override
    public void call(Subscriber<? super R> o) {
        try {
            // 暂时先看做Subscriber<? super T> st = operator.call(o);
            Subscriber<? super T> st = RxJavaHooks.onObservableLift(operator).call(o);
            try {
                st.onStart();
                parent.call(st);
            } catch (Throwable e) {
                Exceptions.throwIfFatal(e);
                st.onError(e);
            }
        } catch (Throwable e) {
            Exceptions.throwIfFatal(e);
            o.onError(e);
        }
    }
}

先调用了OperatorMerge的call方法:

// OperatorMerge类
@Override
public Subscriber<Observable<? extends T>> call(final Subscriber<? super T> child) {
    MergeSubscriber<T> subscriber = new MergeSubscriber<T>(child, delayErrors, maxConcurrent);
    MergeProducer<T> producer = new MergeProducer<T>(subscriber);
    subscriber.producer = producer;
    child.add(subscriber);
    child.setProducer(producer);
    return subscriber;
}

返回的是一个MergeSubscriber实例。
再回到OnSubscribeLift的call方法,然后调用了parent的call方法,parent为原始的OnSubscribe,当在parent的call方法中执行

// 此时的subscriber为MergeSubscriber
subscriber.onNext("1");

MergeSubscriber的onNext便会执行:

// MergeSubscriber类
@Override
public void onNext(Observable<? extends T> t) {
    if (t == null) {
        return;
    }
    if (t == Observable.empty()) {
        emitEmpty();
    } else
    if (t instanceof ScalarSynchronousObservable) {
        tryEmit(((ScalarSynchronousObservable<? extends T>)t).get());
    } else {
        InnerSubscriber<T> inner = new InnerSubscriber<T>(this, uniqueId++);
        addInner(inner);
        t.unsafeSubscribe(inner);
        emit();
    }
}

分析到这里,不知道你晕了没,反正我晕了,绕来绕去。一般我遇到这种情况,在我对框架有一定的理解后,我会尝试跟着框架的思想去写一下,或许能知道作者为什么这么设计。

看到这里,如果没有晕,请继续看代码分析,这里推荐一篇博文:RxJava1.0 flatMap方法的源码分析

如果晕了,请看我下一篇博文Rxjava - 简单实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值