移动架构39_RxAndroid二(变换调用:map、flatMap、lift、compose)
2017-12-26 15:34
411 查看
移动架构38_RxJava一(简单调用)
移动架构39_RxAndroid二(变换调用:map、flatMap、lift、compose)
移动架构40_RxAndroid三(线程控制Scheduler)
移动架构41_Retrofit+RxJava快速集成
前一篇讲了RxJava的一个简单调用
Observable.from(…).subscribe(subscriber)
通常在发出事件之后,处理事件之前,会有一些操作,如请求网络,String变Bitmap等等,可以称之为变换操作;
Func1 和 Action1 非常相似,也是 RxJava 的一个接口,用于包装含有一个参数的方法。 Func1 和 Action的区别在于, Func1 包装的是有返回值的方法。另外,和 ActionX 一样, FuncX 也有多个,用于不同参数个数的方法。
flatMap() 的原理:
用 compose() 来解决:
移动架构39_RxAndroid二(变换调用:map、flatMap、lift、compose)
移动架构40_RxAndroid三(线程控制Scheduler)
移动架构41_Retrofit+RxJava快速集成
前一篇讲了RxJava的一个简单调用
Observable.from(…).subscribe(subscriber)
通常在发出事件之后,处理事件之前,会有一些操作,如请求网络,String变Bitmap等等,可以称之为变换操作;
变换,就是将事件序列中的对象或整个序列进行加工处理,转换成不同的事件或事件序列。
1 map() 事件对象的直接变换
例如:将参数中的 String 对象转换成一个 Bitmap 对象后返回,而在经过 map() 方法后,事件的参数类型也由 String转为了 BitmapObservable.just("img_url") .map(new Func1<String, Bitmap>() { @Override public Bitmap call(String filePath) { // 参数类型 String return getBitmapFromPath(filePath); // 返回类型 Bitmap } }) .subscribe(new Action1<Bitmap>() { @Override public void call(Bitmap bitmap) { // 参数类型 Bitmap showBitmap(bitmap); } });
Func1 和 Action1 非常相似,也是 RxJava 的一个接口,用于包装含有一个参数的方法。 Func1 和 Action的区别在于, Func1 包装的是有返回值的方法。另外,和 ActionX 一样, FuncX 也有多个,用于不同参数个数的方法。
2 flatMap():
flatMap() 和 map() 有一个相同点:它也是把传入的参数转化之后返回另一个对象。但需要注意,和 map() 不同的是, flatMap() 中返回的是个 Observable 对象,并且这个 Observable 对象并不是被直接发送到了 Subscriber 的回调方法中。
flatMap() 的原理:
1. 使用传入的事件对象创建一个 Observable 对象;
2. 并不发送这个 Observable, 而是将它激活,于是它开始发送事件;
3. 每一个创建出来的 Observable 发送的事件,都被汇入同一个 Observable ,而这个 Observable 负责将这些事件统一交给 Subscriber 的回调方法
假设这么一种需求:假设有一个数据结构『学生』,每个学生只有一个名字,但却有多个课程,如果要打印出每个学生所需要修的所有课程的名称。Student[] students = ...; Subscriber<Course> subscriber = new Subscriber<Course>() { @Override public void onNext(Course course) { Log.d(tag, course.getName()); } ... }; Observable.from(students) .flatMap(new Func1<Student, Observable<Course>>() { @Override public Observable<Course> call(Student student) { return Observable.from(student.getCourses()); } }) .subscribe(subscriber);
3 变换的原理:lift()
RxJava 都不建议开发者自定义 Operator 来直接使用 lift(),而是建议尽量使用已有的 lift() 包装方法(如 map() flatMap() 等)进行组合来实现需求,因为直接使用 lift() 非常容易发生一些难以发现的错误
Observable.just(1).lift(new Observable.Operator<String, Integer>() { @Override public Subscriber<? super Integer> call(final Subscriber<? super String> subscriber) { // 将事件序列中的 Integer 对象转换为 String 对象 return new Subscriber<Integer>() { @Override public void onNext(Integer integer) { subscriber.onNext("11" + integer); } @Override public void onCompleted() { subscriber.onCompleted(); } @Override public void onError(Throwable e) { subscriber.onError(e); } }; } }).subscribe(new Observer<String>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(String s) { Log.i(TAG,">>>> course ="+s); } });
3 compose: 对 Observable 整体的变换
compose() 是针对 Observable 自身进行变换。举个例子,假设在程序中有多个 Observable ,并且他们都需要应用一组相同的 lift() 变换
observable1 .lift1() .lift2() .lift3() .lift4() .subscribe(subscriber1); observable2 .lift1() .lift2() .lift3() .lift4() .subscribe(subscriber2);
用 compose() 来解决:
public class LiftAllTransformer implements Observable.Transformer<Integer, String> { @Override public Observable<String> call(Observable<Integer> observable) { return observable .lift1() .lift2() .lift3() .lift4(); } } ... Transformer liftAll = new LiftAllTransformer(); observable1.compose(liftAll).subscribe(subscriber1); observable2.compose(liftAll).subscribe(subscriber2); observable3.compose(liftAll).subscribe(subscriber3); observable4.compose(liftAll).subscribe(subscriber4);
相关文章推荐
- RxAndroid与RxJava 变换的原理值lift()
- 初涉RxAndroid .map() . filter() flatMap()
- RX操作符之对Observable发射的数据执行变换操作一(map、flatmap)
- 初涉RxAndroid .map() . filter() flatMap()
- Android响应式编程开发RxAndroid(4):flatMap
- 移动架构40_RxAndroid三(线程控制Scheduler)
- RxAndroid之Action,Func,map,flatmap的简单用法。
- IPC(进程间通信),Remote Call(远程调用),IDL(接口描述语言)架构及其在BMP(BREW移动平台),Android中的应用浅析
- Android响应式编程开发RxAndroid(4):flatMap
- Android RxJava 之FlatMap()
- 想用rxjava+rxandroid 替换handle实现数字时钟,出现无响应,不能隔一秒调用onNext
- 我收藏的技术知识图(每张都是大图)关于XX背后的知识、技术图,例如:Linux、Nginx架构、PHP知识卡、机会、HTML5移动、Android系统架构、YII架构的典型流程、Css知识表
- RxJava源码解析04-变换过程(flatmap)
- 移动架构34_Android中解析xml文件
- RX学习笔记之map变换
- Android使用百度地图SDK调用百度地图时,发生错误 com.baidu.platform.comjni.map.basemap.JNIBaseMap.Create
- 【Android】RxJava的使用(三)转换——map、flatMap
- Android移动开发-调用摄像头进行拍照的实现
- Android移动开发-调用方向传感器开发简易指南针的实现
- 移动开发----Android mvp 架构的自述