从源码出发了解RxJava的使用(中)


序言

  RxJava牛逼的地方有两点:一是变换(map,flatMap),二是线程控制(subscribeOn,observeOn)。它们的底层实现比较复杂,特别是flatMap,为了了解它,我花了好多力气,很多次都被它的各种调用给绕晕了,不过皇天不负苦心人,终于让我揭开了它的神秘面纱。

变换–map

Integer[] array = new Integer[]{1, 2, 3};
Observable.from(array)
        .map(new Func1<Integer, String>() {
            @Override
            public String call(Integer i) {
                Log.i("My", "call " + i);
                return "str" + i;
            }
        })
        .subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                Log.i("My", "call " + s);
            }
        });

  运行结果:
  这里写图片描述

.map(new Func1<Integer, String>() {

public final <R> Observable<R> map(Func1<? super T, ? extends R> func) {
    return lift(new OperatorMap<T, R>(func));
}

new OperatorMap<T, R>(func)

public final class OperatorMap<T, R> implements Operator<R, T> {

    final Func1<? super T, ? extends R> transformer;

    public OperatorMap(Func1<? super T, ? extends R> transformer) {
        this.transformer = transformer;
    }

    @Override
    public Subscriber<? super T> call(final Subscriber<? super R> o) {
        MapSubscriber<T, R> parent = new MapSubscriber<T, R>(o, transformer);
        o.add(parent);
        return parent;
    }

    static final class MapSubscriber<T, R> extends Subscriber<T> {
        final Subscriber<? super R> actual;       
        final Func1<? super T, ? extends R> mapper;

        public MapSubscriber(Subscriber<? super R> actual, Func1<? super T, ? extends R> mapper) {
            this.actual = actual;
            this.mapper = mapper;
        }

        @Override
        public void onNext(T t) {
            R result = mapper.call(t);
            actual.onNext(result);
        }
        @Override
        public void onError(Throwable e) {
            actual.onError(e);
        }
        @Override
        public void onCompleted() {
            actual.onCompleted();
        }
        @Override
        public void setProducer(Producer p) {
            actual.setProducer(p);
        }
    }
}

return lift(new OperatorMap<T, R>(func));

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

new OnSubscribeLift<T, R>(onSubscribe, operator)

public final class OnSubscribeLift<T, R> implements OnSubscribe<R> {
    static final RxJavaObservableExecutionHook hook = RxJavaPlugins.getInstance().getObservableExecutionHook();
    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;
        this.operator = operator;
    }

    @Override
    public void call(Subscriber<? super R> o) {
        Subscriber<? super T> st = hook.onLift(operator).call(o);
        try {
            // new Subscriber created and being subscribed with so 'onStart' it
            st.onStart();
            parent.call(st);
        } catch (Throwable e) {
            st.onError(e);
        }
    }
}

hook.onLift(operator)

public <T, R> Operator<? extends R, ? super T> onLift(final Operator<? extends R, ? super T> lift) {
    return lift;
}

  总结:

public final <R> Observable<R> map(Func1<? super T, ? extends R> func) {
    return lift(new OperatorMap<T, R>(func));
}
1return new Observable<R>(new OnSubscribeLift<T, R>(onSubscribe, operator));
2)OnSubscribeLift对象的call方法
    public void call(Subscriber<? super R> o) {
        Subscriber<? super T> st = operator.call(o);
        st.onStart();
        onSubscribe.call(st);    
    }
3)OperatorMap对象的call方法
    public Subscriber<? super T> call(final Subscriber<? super R> o) {
        MapSubscriber<T, R> parent = new MapSubscriber<T, R>(o, transformer);
        return parent;
    }
4)MapSubscriber对象的onNext方法
    public void onNext(T t) {
        R result = mapper.call(t);
        actual.onNext(result);
    }

变换–flatMap

Student[] array = getStudentArray();
Observable.from(array)
        .flatMap(new Func1<Student, Observable<Course>>() {
            @Override
            public Observable<Course> call(Student student) {
                Log.i("My", "call " + student.getName());
                return Observable.from(student.getCourses());
            }
        })
        .subscribe(new Action1<Course>() {
            @Override
            public void call(Course course) {
                Log.i("My", "call " + course.getName());
            }
        });

  运行结果:
  这里写图片描述

.flatMap(new Func1<Student, Observable<Course>>() {

public final <R> Observable<R> flatMap(Func1<? super T, ? extends Observable<? extends R>> func) {
    return merge(map(func));
}

return merge(map(func));

public static <T> Observable<T> merge(Observable<? extends Observable<? extends T>> source) {
    return source.lift(OperatorMerge.<T>instance(false));
}

OperatorMerge.<T>instance(false)

public final class OperatorMerge<T> implements Operator<T, Observable<? extends T>> {

    @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;
        return subscriber;
    }

    static final class MergeProducer<T> extends AtomicLong implements Producer {

        final MergeSubscriber<T> subscriber;

        public MergeProducer(MergeSubscriber<T> subscriber) {
            this.subscriber = subscriber;
        }

    }

    static final class MergeSubscriber<T> extends Subscriber<Observable<? extends T>> {
        final Subscriber<? super T> child;

        public MergeSubscriber(Subscriber<? super T> child, boolean delayErrors, int maxConcurrent) {
            this.child = child;
        }

        @Override
        public void onNext(Observable<? extends T> t) {
            InnerSubscriber<T> inner = new InnerSubscriber<T>(this, uniqueId++);
            addInner(inner);
            t.unsafeSubscribe(inner);
        }

        void addInner(InnerSubscriber<T> inner) {
            InnerSubscriber<?>[] a = innerSubscribers;
            int n = a.length;
            InnerSubscriber<?>[] b = new InnerSubscriber<?>[n + 1];
            System.arraycopy(a, 0, b, 0, n);
            b[n] = inner;
            innerSubscribers = b;
        }

        void tryEmit(InnerSubscriber<T> subscriber, T value) {
            emitScalar(subscriber, value, r);
        }

        protected void emitScalar(InnerSubscriber<T> subscriber, T value, long r) {
            child.onNext(value);
        }

        static final class InnerSubscriber<T> extends Subscriber<T> {
            final MergeSubscriber<T> parent;

            public InnerSubscriber(MergeSubscriber<T> parent, long id) {
                this.parent = parent;
            }

            @Override
            public void onNext(T t) {
                parent.tryEmit(this, t);
            }
        }
    }
}

  总结:

Observable.from(array).flatMap
1. return create(new OnSubscribeFromArray<T>(array)); --> onSubscribe为OnSubscribeFromArray
2. return merge(map(func));
   1)map(func) --> return lift(new OperatorMap<T, R>(func));
      --> return new Observable<R>(new OnSubscribeLift<T, R>(onSubscribe, operator));
      --> onSubscribe为OnSubscribeLift#OperatorMap
   2)merge(map(func)) --> return source.lift(OperatorMerge.<T>instance(false));
      --> return new Observable<R>(new OnSubscribeLift<T, R>(onSubscribe, operator));
      --> onSubscribe为OnSubscribeLift#OperatorMerge
OnSubscribeFromArray --> OnSubscribeLift#OperatorMap --> OnSubscribeLift#OperatorMerge

这里写图片描述

1>> subscribe(mySubscriber)
    static <T> Subscription subscribe(Subscriber<? super T> subscriber, Observable<T> observable) {
        subscriber.onStart();  // subscriber为mySubscriber
        observable.onSubscribe.call(subscriber);  // onSubscribe为OnSubscribeLift#OperatorMerge
        return subscription;
    }
2>> observable.onSubscribe.call(subscriber) --> OnSubscribeLift#OperatorMerge.call(mySubscriber)
    public void call(Subscriber<? super R> o) {  // o为mySubscriber
        Subscriber<? super T> st = operator.call(o);  // operator为OperatorMerge
        st.onStart();
        onSubscribe.call(st);  // onSubscribe为OnSubscribeLift#OperatorMap
    }
3>> operator.call(o) --> OperatorMerge.call(mySubscriber)
    public Subscriber<Observable<? extends T>> call(final Subscriber<? super T> child) {  // child为mySubscriber
        MergeSubscriber<T> subscriber = new MergeSubscriber<T>(child, delayErrors, maxConcurrent);
        MergeProducer<T> producer = new MergeProducer<T>(subscriber);
        subscriber.producer = producer;
        return subscriber;
    }
4>> onSubscribe.call(st) --> OnSubscribeLift#OperatorMap.call(MergeSubscriber st)
    public void call(Subscriber<? super R> o) {  // o为MergeSubscriber
        Subscriber<? super T> st = operator.call(o);  // operator为OperatorMap
        st.onStart();
        onSubscribe.call(st);  // onSubscribe为OnSubscribeFromArray     
    }
5>> operator.call(o) --> OperatorMap.call(MergeSubscriber o)
        public Subscriber<? super T> call(final Subscriber<? super R> o) {  // o为MergeSubscriber
        MapSubscriber<T, R> parent = new MapSubscriber<T, R>(o, transformer);
        return parent;
    }
6>> onSubscribe.call(st) --> OnSubscribeFromArray.call(MapSubscriber st)
    public void call(Subscriber<? super T> child) {  // child为MapSubscriber
        child.setProducer(new FromArrayProducer<T>(child, array));  // T为Student
    }
7>> MapSubscriber.setProducer --> FromArrayProducer.request
    public void request(long n) {
        final Subscriber<? super T> child = this.child;  // child为MapSubscriber
        for (T t : array)
            child.onNext(t);  // t为Student
        child.onCompleted();
    }
8>> child.onNext(t) --> MapSubscriber.onNext(Student t)
    public void onNext(T t) {  // t为Student
        R result = mapper.call(t);  // result为Observable<Course>,result.onSubscribe为OnSubscribeFromArray
        actual.onNext(result);  // actual为MergeSubscriber
    }
9>> actual.onNext(result) --> MergeSubscriber.onNext(Observable<Course> t)
    public void onNext(Observable<? extends T> t) {
        InnerSubscriber<T> inner = new InnerSubscriber<T>(this, uniqueId++);
        t.unsafeSubscribe(inner);
    }
10>> t.unsafeSubscribe(inner) --> Observable<Course>.unsafeSubscribe(InnerSubscriber<Course> inner)
    public final Subscription unsafeSubscribe(Subscriber<? super T> subscriber) {  // subscriber为InnerSubscriber
        subscriber.onStart();
        onSubscribe.call(subscriber);  // onSubscribe为OnSubscribeFromArray
        return subscription;
    }
11>> onSubscribe.call(subscriber) --> OnSubscribeFromArray.call(InnerSubscriber subscriber)
    public void call(Subscriber<? super T> child) {  // child为InnerSubscriber
        child.setProducer(new FromArrayProducer<T>(child, array));  // T为Course
    }
12>> InnerSubscriber.setProducer --> FromArrayProducer.request
    public void request(long n) {
        final Subscriber<? super T> child = this.child;  // child为InnerSubscriber
        for (T t : array)
            child.onNext(t);  // t为Course
        child.onCompleted();
    }
13>> child.onNext(t) --> InnerSubscriber.onNext(Course t)
    public void onNext(T t) {  // t为Course
        parent.tryEmit(this, t);  // parent为MergeSubscriber
    }
14>> parent.tryEmit(this, t) --> MergeSubscriber.tryEmit(InnerSubscriber,Course)
    void tryEmit(InnerSubscriber<T> subscriber, T value) {  // subscriber为InnerSubscriber
        emitScalar(subscriber, value, r);
    }
15>> emitScalar(subscriber, value, r) --> MergeSubscriber.emitScalar(InnerSubscriber, T, r)
    protected void emitScalar(InnerSubscriber<T> subscriber, T value, long r) {
        child.onNext(value);  // child为mySubscriber
    }

过滤–filter

Observable.from(new String[]{"hello1", "world1", "hello2", "world2"})
        .filter(new Func1<String, Boolean>() {
            @Override
            public Boolean call(String s) {
                if (s.endsWith("1"))
                    return true;
                else
                    return false;
            }
        })
        .subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                Log.i("My", "call " + s);
            }
        });

  运行结果:
  这里写图片描述

.filter(new Func1<String, Boolean>() {

public final Observable<T> filter(Func1<? super T, Boolean> predicate) {
    return create(new OnSubscribeFilter<T>(this, predicate));
}

new OnSubscribeFilter<T>(this, predicate)

public final class OnSubscribeFilter<T> implements OnSubscribe<T> {

    final Observable<T> source;
    final Func1<? super T, Boolean> predicate;

    public OnSubscribeFilter(Observable<T> source, Func1<? super T, Boolean> predicate) {
        this.source = source;
        this.predicate = predicate;
    }

    @Override
    public void call(final Subscriber<? super T> child) {
        FilterSubscriber<T> parent = new FilterSubscriber<T>(child, predicate);
        source.unsafeSubscribe(parent);
    }

    static final class FilterSubscriber<T> extends Subscriber<T> {

        final Subscriber<? super T> actual;
        final Func1<? super T, Boolean> predicate;

        public FilterSubscriber(Subscriber<? super T> actual, Func1<? super T, Boolean> predicate) {
            this.actual = actual;
            this.predicate = predicate;
        }

        @Override
        public void onNext(T t) {
            boolean result;
            result = predicate.call(t);
            if (result) {
                actual.onNext(t);
            }
        }

        @Override
        public void onError(Throwable e) {
            actual.onError(e);
        }

        @Override
        public void onCompleted() {
            actual.onCompleted();
        }

        @Override
        public void setProducer(Producer p) {
            actual.setProducer(p);
        }
    }
}

source.unsafeSubscribe(parent);

public final Subscription unsafeSubscribe(Subscriber<? super T> subscriber) {
    subscriber.onStart();
    onSubscribe.call(subscriber);
    return subscription;
}

  总结:

Observable.from(array).filter
1. return create(new OnSubscribeFromArray<T>(array)); --> onSubscribe为OnSubscribeFromArray
2. return create(new OnSubscribeFilter<T>(this, predicate)); --> onSubscribe为OnSubscribeFilter
OnSubscribeFromArray --> OnSubscribeFilter
// ***********************************************************************************************
1>> subscribe(mySubscriber)
    static <T> Subscription subscribe(Subscriber<? super T> subscriber, Observable<T> observable) {
        subscriber.onStart();  // subscriber为mySubscriber
        onSubscribe.call(subscriber);  // onSubscribe为OnSubscribeFilter
        return subscription;
    }
2>> onSubscribe.call(subscriber) --> OnSubscribeFilter.call(mySubscriber)
    public void call(final Subscriber<? super T> child) {  // child为mySubscriber
        FilterSubscriber<T> parent = new FilterSubscriber<T>(child, predicate);
        source.unsafeSubscribe(parent);  // source为Observable#OnSubscribeFromArray
    }
3>> source.unsafeSubscribe(parent) --> Observable#OnSubscribeFromArray.unsafeSubscribe(FilterSubscriber)
    public final Subscription unsafeSubscribe(Subscriber<? super T> subscriber) {  // subscriber为FilterSubscriber
        subscriber.onStart();
        onSubscribe.call(subscriber);  // onSubscribe为OnSubscribeFromArray
        return subscription;
    }
4>> onSubscribe.call(subscriber) --> OnSubscribeFromArray.call(FilterSubscriber)
    public void call(Subscriber<? super T> child) {  // child为FilterSubscriber
        child.setProducer(new FromArrayProducer<T>(child, array));
    }
5>> child.setProducer --> FromArrayProducer.request
    public void request(long n) {
        final Subscriber<? super T> child = this.child;  // child为FilterSubscriber
        for (T t : array)
            child.onNext(t);
        child.onCompleted();
    }
6>> child.onNext(t) --> FilterSubscriber.onNext(t)
    public void onNext(T t) {
        boolean result;
        result = predicate.call(t);
        if (result) {
            actual.onNext(t);  // actual为mySubscriber
        }
    }

  变换和过滤终于分析完了~,剩下的就是线程控制了,不知道你们对我这样的源码分析方式能否接受得了呢?如果觉得还行,就请看下一篇“从源码出发了解RxJava的使用(下)”。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值