Rxjava - 简单实现

Retrofit+RxJava+Okhttp简单实现登录注册 简单的一个小Demo. 阅读详情

由于Rxjava比较强大,自然代码量也挺多,源码学习难度相当大。因此,当我分析flapMap时,已经晕了,所以决定顺藤摸瓜,以简单的代码模拟Rxjava小部分功能,相信能帮助大家理解Rxjava原理。

在阅读Rxjava源码时,我都是以观察者模式阅读,观察者频繁变换,搞得我晕晕的,可是我以生产者-消费者模式模拟Rxjava时,发现顿时豁然开朗,所以这里我以生产者-消费者模式类命名,这样更容易理解。

数据工厂(相当Rxjava的OnSubscribe接口)

public interface DataFactory <T> {
    void create(Consumer<T> consumer);
}

很简单,是一个接口,用于生产者。

生产者(相当于Rxjava的Observable类,被观察者)

public class Producer <T> {

    protected DataFactory<T> dataFactory;

    private Producer(DataFactory<T> dataFactory) {
        this.dataFactory = dataFactory;
    }

    public static <T> Producer<T> create(DataFactory<T> dataFactory) {
        return new Producer<>(dataFactory);
    }

    public static <T> Producer<T> from(final T... dataSource) {
        return new Producer<>(new DataFactory<T>() {
            @Override
            public void create(Consumer<T> consumer) {
                for (T data : dataSource) {
                    consumer.onNext(data);
                }
            }
        });
    }

    public void add(Consumer<T> producer) {
        dataFactory.create(producer);
    }

    public <R> Producer<R> map(DataProcessor<T, R> processor) {
        return new Producer<>(new MapDataFactory<>(this, processor));
    }

    public <R> Producer<R> flapMap(DataProcessor<T, Producer<R>> processor) {
        Producer<Producer<R>> mapProducer = map(processor);
        return new Producer<>(new FlapMapDataFactory<>(mapProducer.dataFactory));
    }

}

目前只是实现了map和flapMap方法,我们先看代码,稍后我会详细分析,耐心看下去。

消费者(相当于Rxjava的Observer接口,观察者)

public interface Consumer <T> {

    void onCompleted();

    void onNext(T result);

    void onError(Exception exception);

}

和Rxjava的Observer一样。

数据加工接口(相当于Rxjava的Func接口)

public interface DataProcessor<T, R> {
    R process(T data);
}

也是模仿Rxjava的。

MapDataFactory

public class MapDataFactory <T, R> implements DataFactory <R> {

    private Producer<T> source;
    private DataProcessor<T, R> processor;

    public MapDataFactory(Producer<T> source, DataProcessor<T, R> processor) {
        this.source = source;
        this.processor = processor;
    }

    @Override
    public void create(Consumer<R> consumer) {
        MapConsumer<T, R> mapConsumer = new MapConsumer<>(consumer, processor);
        source.add(mapConsumer);
    }

    public class MapConsumer<T, R> implements Consumer <T> {

        private Consumer<R> source;
        private DataProcessor<T, R> processor;

        public MapConsumer(Consumer<R> source, DataProcessor<T, R> processor) {
            this.source = source;
            this.processor = processor;
        }

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

        @Override
        public void onNext(T result) {
            try {
                R processResult = processor.process(result);
                source.onNext(processResult);
            } catch (Exception e) {
                onError(e);
            }
        }

        @Override
        public void onError(Exception exception) {
            source.onError(exception);
        }

    }

}

暂时先看代码,待会分析,再耐心一下下。

FlapMapDataFactory

public class FlapMapDataFactory <R> implements DataFactory <R> {

    private DataFactory<Producer<R>> dataFactory;

    public FlapMapDataFactory(DataFactory<Producer<R>> dataFactory) {
        this.dataFactory = dataFactory;
    }

    @Override
    public void create(Consumer<R> consumer) {
        FlapMapConsumer flapMapConsumer = new FlapMapConsumer(consumer);
        dataFactory.create(flapMapConsumer);
    }

    public class FlapMapConsumer <R> implements Consumer<Producer<R>> {

        private Consumer<R> source;

        public FlapMapConsumer(Consumer<R> source) {
            this.source = source;
        }

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

        @Override
        public void onNext(Producer<R> result) {
            result.add(source);
        }

        @Override
        public void onError(Exception exception) {
            source.onError(exception);
        }

    }

}

好了,以上是我模拟实现Rxjava所写的类,差不多都是Rxjava的核心代码了。代码量很少吧(高兴一下),接下来我们分析一下!!!

基本流程

先上一个例子:

Producer.create(new DataFactory<Student>() {
    @Override
    public void create(Consumer<Student> consumer) {
        Student student1 = new Student("小明", 20, "高数", "线性代数", "统计学");
        Student student2 = new Student("晓晓", 21, "英语", "电子信息技术", "统计学");
        consumer.onNext(student1);
        consumer.onNext(student2);
        consumer.onCompleted();
    }
}).add(new Consumer<Student>() {
    @Override
    public void onCompleted() {
        Log.e(getClass().getName(), "completed is called");
    }
    @Override
    public void onNext(Student result) {
        Log.e(getClass().getName(), "student name : " + result.name);
    }
    @Override
    public void onError(Exception exception) {
        Log.e(getClass().getName(), "error is called");
    }
});
// Student类
class Student {
    String name;
    int age;
    String[] courses;
    public Student(String name, int age, String... courses) {
        this.name = name;
        this.age = age;
        this.courses = courses;
    }
}

是不是和Rxjava很相似,必须的!
先看Producer的create方法:

// Producer类
protected DataFactory<T> dataFactory;
public static <T> Producer<T> create(DataFactory<T> dataFactory) {
    return new Producer<>(dataFactory);
}

和Rxjava一样,创建一个带有数据工厂的生产者,我们再来看add方法:

// Producer类
public void add(Consumer<T> producer) {
    dataFactory.create(producer);
}

调用了数据工厂的create方法,开始产生数据。或许你会有疑问,Rxjava有这么简单?就是这么简单!!
所以例子中的DataFactory的call方法就会执行:

// 例子new的DataFactory
@Override
public void create(Consumer<Student> consumer) {
    Student student1 = new Student("小明", 20, "高数", "线性代数", "统计学");
    Student student2 = new Student("晓晓", 21, "英语", "电子信息技术", "统计学");
    consumer.onNext(student1);
    consumer.onNext(student2);
    consumer.onCompleted();
}

产生student1和student2后,便开始调用消费者的onNext和onCompleted方法,其实Rxjava的基本流程也就这么简单。

map变换

接下来看看map变换,先来个例子:

Producer.create(new DataFactory<Student>() {
    @Override
    public void create(Consumer<Student> consumer) {
        Student student1 = new Student("小明", 20, "高数", "线性代数", "统计学");
        Student student2 = new Student("晓晓", 21, "英语", "电子信息技术", "统计学");
        consumer.onNext(student1);
        consumer.onNext(student2);
        consumer.onCompleted();
    }
}).map(new DataProcessor<Student, String>() {
    @Override
    public String process(Student data) {
        return data.name;
    }
}).add(new Consumer<String>() {
    @Override
    public void onCompleted() {
        Log.e(getClass().getName(), "completed is called");
    }
    @Override
    public void onNext(String result) {
        Log.e(getClass().getName(), "student name : " + result);
    }
    @Override
    public void onError(Exception exception) {
        Log.e(getClass().getName(), "error is called");
    }
});

map中,把Student“加工”为String类型,再交给消费者处理,看看map方法:

// Producer类
public <R> Producer<R> map(DataProcessor<T, R> processor) {
    return new Producer<>(new MapDataFactory<>(this, processor));
}

创建了新的数据工厂MapDataFactory,返回了新的生产者。当新的生产者调用add方法时,MapDataFactory的create方法就会执行:

// MapDataFactory类
private Producer<T> source;
private DataProcessor<T, R> processor;
@Override
public void create(Consumer<R> consumer) {
    MapConsumer<T, R> mapConsumer = new MapConsumer<>(consumer, processor);
    source.add(mapConsumer);
}

因为生产者Producer生产T类型数据,而消费者Consumer要消费R类型数据,所以必须要个代理类MapConsumer,利用数据加工接口DataProcessor,把生产者Producer生产T类型数据转为R类型数据,再交给消费者Consumer去消费,代理类MapConsumer充当了加工厂的角色。
当调用source(一开始创建的Producer)的add(mapConsumer)方法时,source自带的数据工厂DataFactory(一开始new出来的DataFactory)的create方法便会执行,当执行

// 此时的消费者是代理消费者MapConsumer
consumer.onNext(student1);

MapConsumer的onNext就会执行:

// MapConsumer类
@Override
public void onNext(T result) {
    try {
     // 数据加工
        R processResult = processor.process(result);
        // 通知消费者
        source.onNext(processResult);
    } catch (Exception e) {
        onError(e);
    }
}

MapConsumer的onNext方法会先把数据“加工”,然后交给消费者处理,这样就完成整个流程。

flapMap变换

map方法比较简单,相信把大家难倒的地方是flapMap方法,我们还是先来一个例子:

Producer.create(new DataFactory<Student>() {
    @Override
    public void create(Consumer<Student> consumer) {
        Student student1 = new Student("小明", 20, "高数", "线性代数", "统计学");
        Student student2 = new Student("晓晓", 21, "英语", "电子信息技术", "统计学");
        consumer.onNext(student1);
        consumer.onNext(student2);
        consumer.onCompleted();
    }
}).flapMap(new DataProcessor<Student, Producer<String>>() {
    @Override
    public Producer<String> process(Student data) {
        return Producer.from(data.courses);
    }
}).add(new Consumer<String>() {
    @Override
    public void onCompleted() {
        Log.e(getClass().getName(), "completed is called");
    }
    @Override
    public void onNext(String result) {
        Log.e(getClass().getName(), "course name : " + result);
    }
    @Override
    public void onError(Exception exception) {
        Log.e(getClass().getName(), "error is called");
    }
});

flapMap方法可以由一个数据生成新的生产者,例子中,DataFactory中的create调用了两次onNext方法:

consumer.onNext(student1);
consumer.onNext(student2);

flapMap会创建两个生产者:

Producer.from(data.courses);

每个生产者的数据工厂DataFactory的create方法又会执行很多次(学生的课程数量)onNext方法,这样达到数据“平铺”的作用,在实际使用中有很大的用处。

                            -> onNext() -> ...
每个onNext() -> 新的Producer -> onNext() -> ...
                            -> onNext() -> ...

OK,我们来分析一下,首先是flapMap方法:

// Producer类
public <R> Producer<R> flapMap(DataProcessor<T, Producer<R>> processor) {
    Producer<Producer<R>> mapProducer = map(processor);
    return new Producer<>(new FlapMapDataFactory<>(mapProducer.dataFactory));
}

先调用了map方法:

Producer<T> -----> Producer<Producer<R>>

然后创建了新的数据工厂FlapMapDataFactory,返回了新的生产者。当新的生产者调用add方法时,FlapMapDataFactory的create方法就会执行:

// FlapMapDataFactory类
// DataFactory<Producer<R>>是mapProducer的数据工厂MapDataFactory
private DataFactory<Producer<R>> dataFactory;
@Override
public void create(Consumer<R> consumer) {
    // Consumer<R> -> Consumer<Producer<R>>, 由Consumer<Producer<R>>代理Consumer<R>
    FlapMapConsumer flapMapConsumer = new FlapMapConsumer(consumer);
    dataFactory.create(flapMapConsumer);
}

这里必须要调用mapProducer的数据工厂MapDataFactory的create方法,要不然程序链就断了。FlapMapDataFactory的create方法参数是R类型消费者Consumer,而此时的MapDataFactory的create方法需要的是Producer《R》类型消费者Consumer,所以需要一个FlapMapConsumer 代理类去转换。
dataFactory.create(flapMapConsumer)调用之后,MapDataFactory的create方法开始执行,这又回到map方法分析了:

// source是最开始的Producer
private Producer<T> source;
// flapMap方法传入的DataProcessor<T, Producer<R>>
private DataProcessor<T, R> processor;
@Override
// 此时的consumer为Consumer<Producer<R>>类型
public void create(Consumer<R> consumer) {
    MapConsumer<T, R> mapConsumer = new MapConsumer<>(consumer, processor);
    source.add(mapConsumer);
}

source执行后,执行最开始的数据工厂DataFactory的create方法开始执行:

// source就是Producer.create这个生产者
Producer.create(new DataFactory<Student>() {
    @Override
    // 所以这个create方法会执行,此时的consumer为MapConsumer
    public void create(Consumer<Student> consumer) {
        Student student1 = new Student("小明", 20, "高数", "线性代数", "统计学");
        Student student2 = new Student("晓晓", 21, "英语", "电子信息技术", "统计学");
        consumer.onNext(student1);
        consumer.onNext(student2);
        consumer.onCompleted();
    }
})...

当执行consumer.onNext(student1)时,MapConsumer的onNext方法会执行:

// MapConsumer类
// 此时的T为Student,R为Producer<String>类型
private Consumer<R> source;
private DataProcessor<T, R> processor;
@Override
public void onNext(T result) {
    try {
        // Student -> Producer<String>
        R processResult = processor.process(result);
        source.onNext(processResult);
    } catch (Exception e) {
        onError(e);
    }
}

数据转换之后,调用source的onNext方法,source是FlapMapDataFactory的create方法创建的代理类:

// FlapMapDataFactory类
@Override
public void create(Consumer<R> consumer) {
    // source就是flapMapConsumer这个代理类
    FlapMapConsumer flapMapConsumer = new FlapMapConsumer(consumer);
    dataFactory.create(flapMapConsumer);
}

所以FlapMapConsumer的onNext会执行:

public class FlapMapConsumer <R> implements Consumer<Producer<R>> {

    // 下一个消费者,此时的source为Consumer<String>,也就是例子中最后调用add方法的消费者
    private Consumer<R> source;

    @Override
    // result是MapConsumer的onNext方法加工后的生产者
    public void onNext(Producer<R> result) {
        // 因为此时的result是一个生产者,不再是一个具体的数据,可以再次add下一个消费者
        result.add(source);
    }

}

调用result.add(source)后,新的生产者的数据工厂的create方法便会执行:

...
.flapMap(new DataProcessor<Student, Producer<String>>() {
   @Override
    public Producer<String> process(Student data) {
        // result就是Producer.from(data.courses)这个生产者
        return Producer.from(data.courses);
    }
})
// source就是最后new出来的Consumer消费者
.add(new Consumer<String>() {
    @Override
    public void onCompleted() {
        Log.e(getClass().getName(), "completed is called");
    }
    @Override
    public void onNext(String result) {
        Log.e(getClass().getName(), "course name : " + result);
    }
    @Override
    public void onError(Exception exception) {
        Log.e(getClass().getName(), "error is called");
    }
});

于是乎,上面的代码相当于

Producer.from(data.courses)
.add(new Consumer<String>() {
    @Override
    public void onCompleted() {
        Log.e(getClass().getName(), "completed is called");
    }
    @Override
    public void onNext(String result) {
        Log.e(getClass().getName(), "course name : " + result);
    }
    @Override
    public void onError(Exception exception) {
        Log.e(getClass().getName(), "error is called");
    }
});
...

这就是flapMap的基本原理。

代码已经上传到我的github库,地址:https://github.com/JohanMan/simplerxjava

小米手机软砖诊断与救砖全指南:从卡MI字到恢复桌面 软砖是Android设备常见的启动异常现象,本质并非硬件损坏,而是系统在Bootloader、Kernel或System等层级因AVB校验失败、分区不匹配或SELinux策略冲突触发的自我保护机制。理解启动链路(Power On → SPL → Bootloader → Kernel → init)是精准定位卡点的基础;Fastboot模式作为核心通信通道,其识别依赖专用USB驱动与正确VID/PID支持;线刷包必须严格匹配机型代号(如psyche/venus)、安卓版本及动态分区结构(super.img) 阅读详情

相关推荐

GD32F303调试小记(一)之USART(接收中断、接收空闲中断+DMA、发送DMA)

前言 之前写了GD32F103调试小记(二)之USART(接收中断、接收空闲中断+DMA、发送DMA)一文。这次我们来看看GD32F303的USART是如何配置的,结合这两篇文章,相信大家GD32的USART配置流程会十分熟悉。 DMA 能大大减轻CPU负荷的东西,建议场景合适的情况下,都去用DMA功能。 USART 一种串行通信协议, ...

欢喜6666的博客 3万+

RXJAVA实现生产者、消费者

直接上代码 package com.test; import android.os.SystemClock; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.w...

huangwenkui1990的专栏 1042

企业微信群机器人配置全攻略:从零到消息推送的完整流程

本文详细介绍了企业微信群机器人的配置与使用全流程,从零开始指导如何创建机器人、获取Webhook地址,到通过HTTP请求发送文本、Markdown、图片及模板卡片等多种消息类型。内容涵盖核心的接口配置、安全实践及实战应用场景,帮助开发与运维团队快速构建自动化消息推送中枢,提升协作效率。

weixin_29231725的博客 839

一起来造一个RxJava,揭秘RxJava的实现原理

RxJava是一个神奇的框架,用法很简单,但内部实现有点复杂,代码逻辑有点绕。我读源码时,确实有点似懂非懂的感觉。网上关于RxJava源码分析的文章,源码贴了一大堆,代码逻辑绕来绕去的,让人看得云里雾里的。既然用拆轮子的方式来分析源码比较难啃,不如换种方式,以造轮子的方式,将源码中与性能、兼容性、扩展性有关的代码剔除,留下核心代码带大家揭秘RxJava的实现原理。什么是响应式编程首先,我们需要明确,

TellH的博客 3万+

用Python玩转LQR控制:3行核心代码实现倒立摆稳定控制(附Jupyter Notebook)

本文通过Python实战演示了如何使用LQR算法实现倒立摆的稳定控制。文章以直观方式解释LQR原理,提供从系统建模、核心代码求解到参数调优的完整流程,并附有可运行的Jupyter Notebook代码。重点介绍了如何利用SciPy库快速计算最优反馈增益,并通过仿真验证控制效果,为运动控制实践提供了即学即用的指南。

weixin_29311017的博客 83

​​瑞芯微RK系列 vs 全志系列芯片:终极选型指南(2025版)​

​。

jinxi996611的博客 1万+

手写Rxjava了解核心实现原理

RxJava将观察者模式运用到了极致,使得通过一些简单的操作符就可以实现诸如线程切换、过滤、转换等复杂的业务流程,并通过链式调用保持了代码的可读性和简洁性链式调用是通过在每一个操作符中都返回一个新的被观察者Observable实现每一个操作符的基本实现逻辑,都是先创建新的中间被观察者,利用这个中间被观察者从上游的被观察者获取数据,经过加工处理后,再传递给下游的观察者线程的切换本质上还是通过线程池和Handler实现其他常见操作符:map 转换事件,返回普通事件。

guangdeshishe的博客 1087

115网页版VR模式终于能用了!电脑直接播放vr视频沉浸感满满 115vr播放 无需vr头盔播放vr视频 在线vr播放器 115网盘360度视频播放方法 115全景视频播放教程

油猴 + 脚本让你网页端直接开启 VR 模式支持 360 视频拖动视角,非常沉浸适合电脑设备直接用无需vr头盔也能轻松畅看vr视频,希望也能帮到你。如果你也被 115 的限制搞烦了,不妨试试这招。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 5711

Android RxJava:这是一份RxJava使用入门学习指南,2024年Android进阶者的新篇章

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。还有。

2401_87361511的博客 1474

【部署】Docker部署OpenClaw及常见问题解决(win11)

给AI单独开一个隔离的小容器,AI执行所有命令、下载文件都在这个小盒子里,就算AI被诱导执行危险命令,也不会影响你Win11本机的文件和系统,是必开的安全功能。Docker容器里的OAuth回调,会尝试在你Win11本机的1455端口捕获认证信息,但容器和Win11本机的网络隔离,导致浏览器访问不到这个回调地址。「挂载」就是把你Win11本机的文件夹,共享给容器里的「虚拟小电脑」,两边都能读写文件,比如你想让AI操作你D盘里的代码文件,就需要挂载。

海兰 4697

【大语言模型 21】语言模型训练目标:MLM vs CLM vs GLM对比分析

本文深入对比分析三种主流语言模型训练目标:掩码语言模型(MLM)、因果语言模型(CLM)和双空白填充(GLM)。通过数学推导、代码实现和实验对比,揭示不同训练目标的工作机制、适用场景和性能差异,为选择合适的预训练策略提供科学指导。

熵数实验室 1174

使用Rxjava2和Retrofit2的自定义DefaultObserver

package cn.gdmk.ym.scan.server; import android.widget.Toast; import com.google.gson.Gson; import com.google.gson.JsonParseException; import com.jakewharton.retrofit2.adapter.rxjava2.HttpException; i...

包子大叔的笔记 1355

【OCPP】ocpp1.6协议3.3章节:功能配置文件及接口

Smart Charging Profile中定义了4个接口请求,即GetCompositeSchedule、ClearChargingProfile、SetChargingProfile和ClearCache等。Smart Charging: 包含智能充电相关的功能,如计划充电,报告充电计划,并改变充电速度。Core: 包含电动汽车充电相关的基础功能,如启动和停止充电,更改充电配置,报告充电状态等。Reservation: 包含预约服务相关的功能,如创建,取消和更改预约。

qq_53871375的博客 2170

Rxjava简单的实现

首先要想在android中使用RXjava2,先添加Gradle配置:   implementation 'io.reactivex.rxjava2:rxjava:2.1.16'   implementation 'io.reactivex.rxjava2:rxandroid:2.0.2' 先来一个简单的Hello Word,看看是一个怎样的情况。不多说,直接上代码: Obser...

faskjj的博客 1337

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Android 之路 (1) - RxJava2+Retrofit实现简单登陆

前言 使用RxJava2+Retrofit实现简单登陆。 正文 1. Hello world 1.1 相关版本 Android Studio 3.1.3 Gradle 3.1.3 targetSdkVersion 26 support版本 26.0.2 1.2 创建项目 项目的UI方面选用Design和support,所以在创建项目的时候直接选择【Basic Activity】,AS会自动配...

AndroidRookie 544

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

RxJava 1.x 实现简单的logService

写一个简单的logService(),用于执行过程的语句输入和调试。package org.teamlet;import rx.Observable;public class LogService { public static <T> void log(Observable<T> observable, String name) { observable.subscribe(

王洪伟的专栏 1311

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Simple RxJava 简单的RxJava实现

RxJava是非常好的开源库,大家都懂的,为了学习它的源码,我按照源码抽出来最简单的几个概念,写了一个极简的RxJava,4个类,3个接口,能做到嵌套拉平,线程切换以及单个值的类型转换操作,其实基本上算照抄代码啦- - ),这里简单记录一下。三个接口:Observe、OnSubscribe、OperatorObserve:相当于监听主题发出通知的回调,也可以理解为接受处理结果的地方,因为这个原因,比

春雨之神 464

再一次对RxJava的理解和感悟,手写简单实现

最近又看了下RxJava 感觉又领悟了些东西,于是想写下来分享一下 首先再RxJava中经常看到这两个角色observable和observer

w_1220577523的博客 283

简单java登录页面android_Android 之路 - RxJava2+Retrofit实现简单登陆

原标题:Android 之路 - RxJava2+Retrofit实现简单登陆前言使用RxJava2+Retrofit实现简单登陆。正文1. Hello world1.1 相关版本Android Studio 3.1.3Gradle 3.1.3targetSdkVersion 26support版本 26.0.21.2 创建项目项目的UI方面选用Design和support,所以在创建项目的时候直...

weixin_34966284的博客 380

kotlin实现简单Rxjava operator原理

interface FuncT, R> { fun call(t: T): R } interface SubscriberT> { fun onNext(t: T) } class ObservableT>(val onSubscribe: OnSubscribeT>) { interface OnSubscribeT> { fun call(s

VincentKN的博客 898

RxJava2+Retrofit实现简单登陆

转发自:原文地址 使用RxJava2+Retrofit实现简单登陆。 正文 Hello world 1.1 相关版本 Android Studio 3.1.3 Gradle 3.1.3 targetSdkVersion 26 support版本 26.0.2 1.2 创建项目 项目的UI方面选用Design和support,所以在创建项目的时候直接选择【Basic Activity】,AS会...

m0_38048084的博客 606

这是用RxJava实现的一个简单demo

这是用RxJava实现的一个简单demo RxJava 在 GitHub 主页上的自我介绍是 "a library for composing asynchronous and event-based programs using observable sequences for the Java VM"(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。这就是 RxJava(不过单凭靠

抱着肩膀笑看看 1913

RxJava2,简单替换Handler的实现

Android中Handler的使用,是很常见的一种,用于子线程与主线程之间的切换,但如果使用不当,很容易发生内存泄漏,网上对于Handler的内存泄漏也是方法万千,本文主要使用RxJava替换项目中Handler的使用 1,导入RxJava的引用 implementation 'io.reactivex.rxjava2:rxjava:2.0.1' implementation 'io.re...

程序员吗? 3204

Android使用Kotlin+Retrofit+RxJava+MVP实现简单的网络请求封装

上一篇博客我们讲了kotlin+retrofit+rxjava实现网络请求的简单实现,本篇博客将实现之前的基础上实现kotlin+retrofit+rxjava+mvp的简单封装实现网络请求. 请求的url为:const val BASE_SERVER_URL = "https://www.wanandroid.com" 1.BaseActivity代码如下: /** * @作者: njb * @时间: 2020/12/3 17:33 * @描述: */ abstract class B

u012556114的博客 809

RxJava+Retrofit 简单理解实现

RxJava+Retrofit 简单理解实现

lyb249473330的博客 779
上一篇: Rxjava - flapMap变换
下一篇: Rxjava - 线程调度
JohanMan
博客等级 码龄10年 72粉丝 131原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值