RxJava源码分析(2) 变换原理

RxJava 2.x 源码分析(三) 变换操作符map和flatMap RxJava的操作符有很多,一般常用的有变换操作符,其中最主要是map和flatMap,本文将分别来讲解一下它们的实现原理。在上一篇文章:RxJava 2.x 源码分析(二) 线程切换原理中,讲到RxJava框架的执行流程,理解这个对我们源码的阅读是有很大帮助的,所以如果你还不懂的话,请移步到上一篇文章去读一下 一:map的实现原理 老规矩,先上一个例子: Observable.c... 阅读详情

RxJava源码分析基于RxJava1.3.8。

在上一章节中,主要介绍了RxJava的基本使用并对该部分的源码做了详细分析。在这一章节中,将主要介绍RxJava的另一大核心功能:变换。

变换,就是将事件序列中的对象或整个序列进行加工处理,转换成不同的事件或事件序列。

在RxJava中,提供了许多针对不同场景实现变换功能的操作符,如下:

  • map()
  • flatMap(), concatMap(), and flatMapIterable()
  • switchMap()
  • scan()
  • groupBy()
  • buffer()
  • window()
  • cast()

虽然,RxJava中提供了如此多的变换操作符,但是变换的原理基本都是一致的。在本章节将主要针对map()和flatMap()操作符来分析变换的原理。

接下来,先通过一个实例来理解什么是变换以及map()实现变换的原理。

map变换

实例

需求,根据图片url实现ImageView图片的加载。

以下通过RxJava实现该操作:

Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<? super String> subscriber) {
        // 1、传入图片路径
        subscriber.onNext("http://localhost:8080/...");
    }
}).map(new Func1<String, Bitmap>() {
    @Override
    public Bitmap call(String s) {
        // 2、根据图片路径获取Bitmp并返回
        Bitmap bitmap = getImageBitmap(s);
        return bitmap;
    }
}).subscribe(new Action1<Bitmap>() {
    @Override
    public void call(Bitmap bitmap) {
        // 3、ImageView设置Bitmap
        imageView.setImageBitmap(bitmap);
    }
});

在上面RxJava代码中,功能很清晰就是通过url实现图片的加载的流程,并且这里就完成了一个变换的过程:我们只传入了一个图片url,但在map方法中完成图片url到Bitmap转换的过程,最终在Action1.call(Bitmap)中只需要设置bitmap给ImageView即可。

所以在上述流程中,map(Func1)是完成变换的核心方法,下面我们就对该方法的源码做具体分析。

为了便于上述代码的分析,我们将上面链式调用的代码改成非链式调用的代码,这要能更清楚的展示两个Observable对象:stringObservable和mapObservable,如下:

Observable<String> stringObservable = Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<? super String> subscriber) {
        // 1、传入图片路径
        subscriber.onNext("http://localhost:8080/...");
    }
});
Observable<Bitmap> mapObservable = stringObservable.map(new Func1<String, Bitmap>() {
    @Override
    public Bitmap call(String s) {
        // 2、根据图片路径获取Bitmp并返回
        Bitmap bitmap = getImageBitmap(s);
        return bitmap;
    }
});
mapObservable.subscribe(new Action1<Bitmap>() {
    @Override
    public void call(Bitmap bitmap) {
        // 3、ImageView设置Bitmap
        imageView.setImageBitmap(bitmap);
    }
});

map操作符源码分析

首先,我们看下map(Func1)方法的具体实现,如下:

public final <R> Observable<R> map(Func1<? super T, ? extends R> func) {
    // 创建一个Observable对象并返回
    return unsafeCreate(new OnSubscribeMap<T, R>(this, func));
}

关于unsafeCreate()方法在上一章节已经讲解过,这里就不在重复了。

在map(Func1)方法中,主要有两个功能:

  1. 创建并返回Observable对象,对于该Observable对象这里称之为mapObservable对象。
  2. 为mapObservable对象创建了一个OnSubscribe对象,也就是OnSubscribeMap对象(OnSubscribeMap对象是实现变换以及链式调用的核心)

在通过map(Func1)方法创建并返回mapObservable对象后,该mapObservable就通过调用subscribe()方法开始整个事件。

根据上章节对subscribe()方法的分析可知:在subscribe()方法内部会调用对应Observable对象(这里就是mapObservable对象)的onSubscribe.call()方法。而在mapObservable对象中onSubscribe实际就是指OnSubscribeMap对象,所以接下来就需要看看该类都做了些什么。

OnSubscribeMap

OnSubscribeMap源码如下:


public final class OnSubscribeMap<T, R> implements OnSubscribe<R> {

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

    /**
     * 1、构造方法
     *
     * @param source        变换前Observable对象,也就是stringObservable
     * @param transformer   Func1对象,通过map方法传入的参数
     */
    public OnSubscribeMap(Observable<T> source, Func1<? super T, ? extends R> transformer) {
        this.source = source;
        this.transformer = transformer;
    }

    /**
     * 开始事件的方法
     *
     * @param o 观察者对象,该参数就是通过subscribe()方法传入的参数
     */
    @Override
    public void call(final Subscriber<? super R> o) {
        // 创建观察者对象,MapSubscriber
        MapSubscriber<T, R> parent = new MapSubscriber<T, R>(o, transformer);
        // 将创建的观察者对象添加到定于列表中
        o.add(parent);
        // 调用方法,这是整个事件的开始
        source.unsafeSubscribe(parent);
    }

    static final class MapSubscriber<T, R> extends Subscriber<T> {

    // 该内部类稍后在讲解
    }
}

这里,我们需要关注的是call()方法,在call()方法内部,最终会通过source.unsafeSubscribe(parent)开始整个事件的链式调用。

这里,我们看下source.unsafeSubscribe(parent)方法的内部实现:

public final Subscription unsafeSubscribe(Subscriber<? super T> subscriber) {
    try {
        subscriber.onStart();
        /**
         * 1、通过onObservableStart()方法获取OnSubscribe对象,也就是创建stringObservable对象是传入的OnSubscribe对象
         * 2、调用OnSubscribe对象的call方法
         */
        RxJavaHooks.onObservableStart(this, onSubscribe).call(subscriber);
        return RxJavaHooks.onObservableReturn(subscriber);
    } catch (Throwable e) {
        // 省略部分代码
    }
}

对于source变量,在OnSubscribeMap代码中就提到过,source变量就是指向引用stringObservable对象,这样虽然是通过mapObservable对象先调用subscribe()方法,但是最终还是stringObservable调用了subscribe()方法,这样也就保证了链式调用始终是从上而下执行的。

MapSubscriber

在上面的流程中,我们仅仅完成了链式调用的第一步,也就是stringObservable完成了call方法的调用,那么变换又是如何实现的呢?

在stringObservable.call(Subscriber)方法调用时,我们需要注意此时call(Subscriber)方法中传入的参数实际已经变成了MapSubscriber(看OnSubscribeMap.call()方法)。

MapSubscriber是OnSubscribeMap的一个静态内部类并且该类继承自Subscriber,所以它是一个观察者。

MapSubscriber类代码如下:

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

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

    boolean done;

    /**
     * 构造方法
     * @param actual  观察者对象,也就是subscribe()方法传入的参数
     * @param mapper  Func1对象,通过map方法传入的参数
     */
    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;

        try {
            // 1、调用Func1对象的call方法,实现事件变换
            result = mapper.call(t);
        } catch (Throwable ex) {
            Exceptions.throwIfFatal(ex);
            unsubscribe();
            onError(OnErrorThrowable.addValueAsLastCause(ex, t));
            return;
        }

        // 2、完成变换后,将变换后的结果传入到下一个观察者
        actual.onNext(result);
    }

    @Override
    public void onError(Throwable e) {
        if (done) {
            RxJavaHooks.onError(e);
            return;
        }
        done = true;

        actual.onError(e);
    }


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

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

}

根据上述代码可知:MapSubscriber.onNext()方法就是实现变换的核心。在该方法中会根据传入的原始参数并通过Func1.call(t)完成变换功能,最终将变换的结果传递到下一个事件中去。

这里,我们可以通过一张图来描述上述整个过程:
这里写图片描述

flatMap变换

flatMap操作符:使用一个指定的函数对原始Observable发射的每一项数据执行变换操作,这个函数返回一个本身也发射数据的Observable,然后FlatMap合并这些Observables发射的数据,最后将合并后的结果当做它自己的数据序列发射。

实例演示

需求:输入学生列表中的每个学生的具体课程名称。

通过RxJava代码实现:

Observable
        .from(students)
        .flatMap(new Func1<Student, Observable<Course>>() {
            @Override
            public Observable<Course> call(Student student) {
                return Observable.from(student.courseList);
            }
        })
        .subscribe(new Action1<Course>() {
            @Override
            public void call(Course course) {
                System.out.println(course.courseName);
            }
        });

同样的,为了便于分析源码,我们将上面链式调用的源码改为非链式调用的源码,如下:

Observable<Student> fromObservable = Observable.from(students);
Observable<Course> flatMapObservable = fromObservable.flatMap(new Func1<Student, Observable<Course>>() {
    @Override
    public Observable<Course> call(Student student) {
        return Observable.from(student.courseList);
    }
});
flatMapObservable.subscribe(new Action1<Course>() {
    @Override
    public void call(Course course) {
        System.out.println(course.courseName);
    }
});

flatMap操作符源码分析

创建flatMapObservable

首先,我们看下flatMapObservable的创建过程,内部代码如下:

/**
 * 开始变换
 * 
 * @param func
 * @param <R>
 * @return
 */
public final <R> Observable<R> flatMap(Func1<? super T, ? extends Observable<? extends R>> func) {
    if (getClass() == ScalarSynchronousObservable.class) {
        return ((ScalarSynchronousObservable<T>)this).scalarFlatMap(func);
    }

    /*
     * 1、通过map(func)方法创建一个Observable对象,该对象的onSubscribe类型为OnSubscribeMap
     * 2、通过merge()方法创键创建一个新的Observable对象,并返回最终通过该Observable调用subscribe()方法
     */
    return merge(map(func));
}

/**
 * 创建变换后的Observable对象
 * 
 * @param source    通过map(func)方法创建一个Observable对象,改对象的onSubscribe类型为OnSubscribeMap
 * @return
 */
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());
    }

    /*
     * 1、OperatorMerge.<T>instance(false)获取一个OperatorMerge(HolderNoDelay.INSTANCE)对象,该对象实际就是一个Func1
     *
     * 2、通过map(func)创建的Observable对象调用lift()方法
     */
    return source.lift(OperatorMerge.<T>instance(false));
}

/*
 * 1、通过map(func)创建的Observable对象调用lift()方法
 *
 * @param operator   OperatorMerge.<T>instance(false)获取一个OperatorMerge对象,该对象实际就是一个Func1
 * @param <R>
 * @return
 */
public final <R> Observable<R> lift(final Operator<? extends R, ? super T> operator) {
    /*
     *  这里onSubscribe实例是OnSubscribeMap
     */
    return unsafeCreate(new OnSubscribeLift<T, R>(onSubscribe, operator));
}

/**
 * 最终通过flatMap()方法创建的Observable,该类的onSubscribe类型为OnSubscribeLift
 *
 * @param f
 * @param <T>
 * @return
 */
public static <T> Observable<T> unsafeCreate(OnSubscribe<T> f) {
    return new Observable<T>(RxJavaHooks.onCreate(f));
}

在flatMap操作符下,将创建一个新的Observable对象,该对象的onSubscribe对象实例为OnSubscribeLift,最终在该Observable.subscribe()方法调用时OnSubscribeLift.call()会被调用。

接下来,就来看下订阅的过程吧。

flatMapObservable订阅事件

完成了flatMapObservable变换Observable的创建后,就要调用订阅方法subscribe()了,如下:

flatMapObservable.subscribe(new Action1<Course>() {
    @Override
    public void call(Course course) {
        System.out.println(course.courseName);
    }
});

通过在上一章节中的介绍,我们了解到flatMapObservable.subscribe(subscriber)调用时,内部会调用flatMapObservable.onSubscribe.call(subscriber),这里就需要确定flatMapObservable.onSubscribe的具体类型了。

由上面flatMapObservable的创建可知,flatMapObservable.onSubscribe的具体类型就是lift()方法中创建的OnSubscribeLift。

OnSubscribeLift源码如下:

public final class OnSubscribeLift<T, R> implements Observable.OnSubscribe<R> {
    /**
     * parent类型,就是创建fromObservable时,创建的OnSubscribe对象
     *
     * OnSubscribeMap类型,
     */
    final Observable.OnSubscribe<T> parent;
    /**
     * OperatorMerge(HolderNoDelay.INSTANCE)对象
     */
    final Observable.Operator<? extends R, ? super T> operator;

    public OnSubscribeLift(Observable.OnSubscribe<T> parent, Observable.Operator<? extends R, ? super T> operator) {
        this.parent = parent;
        this.operator = operator;
    }

    @Override
    public void call(Subscriber<? super R> o) {
        try {
            // 创建一个MergeSubscriber,该对象被被o持有
            Subscriber<? super T> st = RxJavaHooks.onObservableLift(operator).call(o);
            try {
                st.onStart();
                //  OnSubscribeMap.call()被调用,这个里面其实就map操作符转换的结果
                parent.call(st);
            } catch (Throwable e) {
                // ....
            }
        } catch (Throwable e) {
            // ....
        }
    }
}

在OnSubscribeLift.call(Subscriber)方法中,最终会调用parent.call(st),这个parent就是fromObservable.onSubscribe对象,这里指的就是OnSubscribeMap对象,这样RxJava链式调用的第一步就完成了,其实还是map()操作符的变换。

然而,与普通map操作符不同的是,在parent.call(st)方法中传入的参数为MergeSubscriber,这个参数最终会被MapSubscriber对象持有并在onNext()方法中被调用到。

MergeSubscriber源码如下(该方法过长,这里就看下onNext方法),这个对象的作用是将完成转化的序列(这是是指Observable序列)依次发射出去并最终被调用。

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

    // 通过onNext的参数就能知道,这个是处理转换后的Observable
    @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 {
            // 1、创建一个Subscriber
            InnerSubscriber<T> inner = new InnerSubscriber<T>(this, uniqueId++);
            // 2、通过addInner()方法存储所有转换后的Subscriber,合并所有的Observable对象。
            addInner(inner);
            t.unsafeSubscribe(inner);
            // 3、将转换后的序列发出并处理,这里最终会调用我们subscribe()方法中传入的Subscriber.onNext()方法。
            emit();
        }
    }

}

这样关于flatmap变换操作的讲解就讲到这里了。

总结

通过map及flatMap操作符源码的分析可知,对于变换操作符的核心流程就是通过OnSubscribeLift类实现的。同时创建MapSubscribe及OnSubscribeMap这两个类,对于不同种类的变换不同的仅仅就是最终在OnSubscribeLift指定这两个类中具体的属性而已。

Rxjava源码分析&实践(六)【实践环节:map操作符功能实现】 目前为止,我们实现了Rxjava的框架搭建、mao操作符的实现,在这个过程中,大家发现了是否对之前Rxjava原理一章的知识有了更加深入的感悟呢?篇幅所限,本文没有带着大家一起去画流程图,建议大家在实现前 or 实现后,去画一下,相信收获肯定更多。 阅读详情

相关推荐

单细胞多组学数据整合分析实战:从原始数据到跨平台合并

本文详细介绍了单细胞多组学数据整合分析的实战流程,从原始数据处理到跨平台合并分析。通过Seurat和Harmony等工具的应用,帮助研究者有效解决批次效应问题,保留真实的生物学信号。文章包含代码示例和常见问题解决方案,特别适合需要进行单细胞合并分析的研究人员参考。

weixin_30752699的博客 90

RxJava 基本原理

Retrofit是对网络框架的封装,真正的网络请求是通过OkHttp完成的 Retrofit主要用到了适配器模式 使用Retrofit五个步骤: 创建网络请求接口,设置请求类型和参数 创建Retrofit实例,设置数据解析器(Gson、XML、Protobuf)和网络适配器 创建接口对象(动态代理),配置网络请求参数 调用接口方法返回Call对象或适配器封装的对象 处理适配器逻辑或直...

汪子涵的博客 1258

保姆级教程:用CST 2023一步步复现一个1-8GHz Vivaldi天线(含参数优化与结果分析)

本文提供了一份详细的CST 2023教程,指导读者如何从零开始设计并优化1-8GHz Vivaldi天线。内容涵盖工程设置、参数化建模、仿真加速技巧以及性能优化策略,特别适合需要实现宽带天线设计的工程师和研究人员。通过实战案例,帮助用户掌握Vivaldi天线的核心设计要点和CST高级功能应用。

weixin_30800987的博客 619

Rxjava工作原理总结

Rxjava整体工作原理 本质上是观察者模式:Observer(观察者)监听Observable(被观察者)。每个操作符实际上会创建一个Observable,其中配套会创建一个代理了下一级注册给它的Observer的Observer。在代码链的最后进行subsribe时,每一层的Observable会依次逆序(从最后一层到第一层)地把自己的Observer注册给上一级的Observable,直到第...

weixin_34234829的博客 457

DC-DC电源PCB布局实战:从EMI优化到热管理

本文深入探讨了DC-DC电源PCB布局的核心实战技巧。文章从分析电流环路入手,强调通过优化“黄金三角”布局以最小化环路面积,从而有效抑制EMI并提升效率。详细阐述了功率器件摆放、地线分割、敏感信号布线、电感下方铺铜策略以及热管理设计等关键步骤,为工程师提供了一套从理论到实践的完整布局指南。

z5a6b的博客 721

语音增强评价指标全解析:从MOS到eSTOI的实战指南

本文全面解析了语音增强领域的核心评价指标,包括主观评价的黄金标准MOS,以及PESQ、STOI、eSTOI等关键客观指标。文章详细阐述了各指标的原理、适用场景与实战计算方法,并提供了Python代码示例,旨在帮助开发者和研究者建立科学的评估体系,以平衡语音可懂度与音质,从而优化算法效果。

yhn456789的博客 1200

RxJava介绍及基本原理

RxJava是ReactiveX家族的重要一员,ReactiveX是的缩写,一般简写为Rx。ReactiveX官方给RxRx是一个使用可观察数据流进行异步编程的编程接口。ReactiveX不仅仅是一个编程接口,它是一种编程思想的突破,它影响了许多其它的程序库和框架以及编程语言。它拓展了观察者模式,使你能够自由组合多个异步事件,而不需要去关心线程同步,线程安全并发数据以及I/O阻塞。RxJava在Java环境下使用,它通过Observable(可观测对象)和Subscriber(订阅者)来实现异步编程模型。

极客专栏 1690

三极管电平转换电路

摘要:本文介绍了三种基于三极管的电平转换电路方案。第一种采用双NPN三极管实现3.3V转5V反相电平转换;第二种使用单NPN三极管完成5V转3.3V同相转换;第三种利用单PNP三极管实现3.3V转5V同相转换。各方案均通过三极管的开关特性配合电阻网络实现电压域适配,具有结构简单、成本低的优点,适用于不同逻辑电平设备(如MCU与外设)间的信号兼容传输。文中详细分析了各电路的工作原理、元件作用和特性,并通过Multisim仿真验证了其功能有效性。

XU157303764的博客 1855

RxJava 实例

三种方式:Observable.create、Observable.just、Observable.fromArray@Override}});}使用observer或者subscriber@Override}@Override}@Override}@Override}};特别注意:2种方法的区别,即Subscriber 抽象类与Observer 接口的区别。

xiaowang_lj的博客 708

Apifox接口测试+自动化测试

Apifox 接口测试+自动化测试快速入门!

程序员小杨哥的博客 1万+

[Dify实战] 招聘筛简历机器人:自动筛选、排序、生成面试要点-带绑定资源

摘要:本文介绍了如何利用Dify优化简历筛选流程,解决人工筛选耗时、标准不统一等问题。通过结构化输出"评分+亮点+风险+面试关注点",将主观判断转化为规则化流程。关键步骤包括:设计标准化Prompt、配置权重排序策略、确保公平合规性、与ATS系统对接,以及持续优化评估指标。该方法能显著提升筛选效率(缩短招聘周期)、增强一致性(避免主观偏差),并为面试官提供结构化参考信息,最终实现更高效精准的人才筛选。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 581

RxJava使用及原理

RxJava的使用及简单的原理 Jxl是一个开源的Java Excel API项目,通过Jxl,Java可以很方便的操作微软的Excel文档。除了Jxl之外,还有Apache的一个POI项目,也可以操作Excel,两者相比之下:Jxl使用方便,但功能相对POI比较弱。POI使用复杂,上手慢,除了这个没啥说的了。 二、特点

蜕变的快乐 2378

Camera HAL Camx — DRQ总结

Camera HAL — DRQ(延迟请求队列)总结 DRQ是CAMX核心层的依赖驱动延迟执行调度器,解决Node处理请求时依赖未就绪的问题。其主要特点包括: 核心功能:当Node处理请求时缺少必要输入(property/metadata/fence),DRQ将其挂起并在依赖满足后重新调度,避免阻塞流水线或丢帧。 系统架构:Session持有主DRQ实例,管理该Session下所有Pipeline Node的依赖;CHI context另有独立DRQ实例专门处理Chi fence同步。 关键数据结构: De

DU_YULIN的博客 75

RxJava2.X源码分析(五):变换操作符的实现原理(上)

一 前言 Rxjava最好用的其实还是它的变换操作符,接下来我们来剖析一下常用的变换操作符的实现原理;操作符的分析我打算是分成两篇学习,先从简单的map入手,当了解其本质后再分析强大的flatMap操作符。 二 从Demo到源码 我们先来看一个例子: Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Intege

qq_39431405的博客 215

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

RxJava2.X源码分析(六):变换操作符的实现原理强化篇(下)

一 前言 Ok,我们在上一篇RxJava2.X 源码分析(五):变换操作符的实现原理(上)中分析了RxJava2中转换操作符map的实现过程 本次我们将紧跟上篇的步伐,分析比map更为强大的flatMap操作符的实现流程 二 Demo 首先,我们还是老样子,先看一个demo: Observable observable = Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(@

qq_39431405的博客 249

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

RxJava2源码分析

RxJava2源码分析 RxJava的鼎鼎大名相信Android开发的同学都非常熟悉了,其实不仅仅有RxJava,还有RxJs,RxKotlin等等一系列。可以说Rx并不是一种局限于Android的框架,Rx是一种思想,我们深入了解了RxJava,同样会加深我们对其他Rx系列的认知。 使用方法 我们来看一个常见的例子: Observable.create(ObservableOnS...

BlackFlagBin的博客 307

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

高级RxJava 2响应式编程思想

课程介绍—课程整体内容介绍 响应式编程思想概述—概念与案例讲解 Rxjava基本元素—源码解析与案例实践 Operator操作符变换—源码解析与案例实践 Scheduler线程变换—源码解析与案例实践 整体变换compose和Transformer原理 RxJava+Retrofit+MVP综合案例(未完成,持续更新......) RxJava2源码 https://www.javaxxz.com/thread-397535-1-1.html ...

weixin_46020146的博客 180

你所不知道的Rxjava原理

目录 RxJava是什么? rxjava核心设计思想 RxJava使用&原理分析 基本使用 基本使用源码分析 线程切换 线程切换源码分析 RxJava变换 总结: RxJava是什么? 根据官方文档:RxJava是ReactiveX(Reactive Extensions)的Java VM实现:一个库,用于通过使用可观察序列来编写异步和基于事件的程序。 rxj...

TT的博客 859

【RxJava】RxJava3核心功能讲解和源码分析

一个是Observable的订阅顺序,一个是doOnSubscribe的执行顺序,Observable的订阅顺序上面已经得出结论了,是从后往前执行的。当没有指定ObserveOn,但是指定了SubscribeOn时,由于onNext代码是从最上游的Observable.subscribeActual开始的,所以所有的onNext都会在最近一个SubscribeOn指定的线程中执行。reduce:将上游Observable的相邻两个数据进行运算,再拿结果与下一个数据进行运算,如此循环,得到一个最终值。

天天向上 Up Up Up (*^▽^*) 2379

RxJava源码分析(map,flatmap和类型变换)

目录 RxJava简介 RxJava源码分析(map方法) 简单示例 源码分析 示例代码执行 小结 RxJava源码分析(flagmap方法) 简单示例 源码分析 示例代码执行 小结 RxJava简介 RxJava是现在大火的一个异步框架,他代码简洁好懂,功能强大,扩展性高,维护难度小。 RxJava最具特色的就是他的类型变换了,这是RxJava最难理解的一部分,也是R...

yan245294305的博客 817

Android RxJava原理分析

团队并行开发,每个人对自己模块的api进行封装,然后利用Retrofit的create方法创建出对应的apiservice进行网络请求,各个模块都需要含有apiservice实例的简单单例封装,那么多个模块就有多个单例,这个时候就需要工厂模式进行设计。

疾风的博客 3745

小明要吃冰淇淋之RxJava:lift原理

个人博客地址 http://dandanlove.com/ 前言 关于RxJava的基础心法解析 我们在使用 RxJava 的时候必不可少的会使用一些基础的操作符, map 、 flatMap 、 filter 等。这些都是对 Obserbable 进行各种各样的变化,我们查看其实现都能看到一个叫做 lift 的操作符。 lift源码 我们先看源码(rxjava:1.3.0),再通过一个例子来熟悉...

stven_king的专栏 1798

【RxJava】进阶必备:lift的使用与基本原理

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<? exte

qq_23049111的博客 3884

Carson带你学Android:图文解析RxJava原理

今天,carson今天将采用 图文的方式 解析 Rxjava的基本原理,希望大家会喜欢。

Carson带你学Android 7498

RxJava模式与原理

RxJava模式与原理

yzpbright的博客 288

RxJava2源码分析——Map操作符

本文章主要是对RxJava2的Map操作符进行源码分析,在阅读之前,可以先阅读以下文章: RxJava2源码分析——订阅 RxJava2源码分析——线程切换 本文章用的RxJava和RxAndroid版本如下: implementation 'io.reactivex.rxjava2:rxjava:2.2.6' implementation 'io.reactivex.rxjava2:rxandr...

qq_20417381的博客 286
上一篇: RxJava源码分析
Kerwin zhang
博客等级 码龄12年 21粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值