Rxjava
来源:互联网 发布:平顶山java培训班经验 编辑:程序博客网 时间:2024/05/17 07:36
由于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@Overridepublic 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;@Overridepublic 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方法便会执行,当执行
// 此时的消费者是代理消费者MapConsumerconsumer.onNext(student1);
MapConsumer的onNext就会执行:
// MapConsumer类@Overridepublic 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的数据工厂MapDataFactoryprivate DataFactory<Producer<R>> dataFactory;@Overridepublic 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是最开始的Producerprivate 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;@Overridepublic 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类@Overridepublic 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
- rxjava
- RXJava
- RXJava
- RXJava
- RxJava
- Rxjava
- RxJava
- RxJava
- Rxjava
- RxJava
- RxJava
- RxJava
- RxJava
- RxJava
- RxJava
- RxJava
- rxjava
- RxJava
- 百度编辑器UEditor关闭css,js,html过滤
- 【初学者视角】线性回归实践
- nvidia-smi GPU驱动安装后使用率很高
- 小米:朋友圈,并查集
- LeetCode
- Rxjava
- android实现动态生成控件(setTag和getTag属性的用法)
- Centos 安装 memcached 完整脚本
- 用JavaScript将Canvas内容转化成图片的方法
- docker--基础镜像和dockerfile
- Linux0.11学习记录
- Array的内置方法api
- iptables学习笔记:端口转发之“外网访问内网”
- 【nginx-rtmp】08、指令(Directives)之 直播(Live)