Android移动架构汇总​​​​​​​
移动架构38_RxJava一(简单调用)
移动架构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转为了 Bitmap

Observable.just("img_url")    .map(new Func1() {        @Override        public Bitmap call(String filePath) { // 参数类型 String            return getBitmapFromPath(filePath); // 返回类型 Bitmap        }    })    .subscribe(new Action1() {        @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 subscriber = new Subscriber() {    @Override    public void onNext(Course course) {        Log.d(tag, course.getName());    }    ...};Observable.from(students)    .flatMap(new Func1>() {        @Override        public Observable 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() {            @Override            public Subscriber<? super Integer> call(final Subscriber<? super String> subscriber) {                // 将事件序列中的 Integer 对象转换为 String 对象                return new Subscriber() {                    @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() {            @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 {    @Override    public Observable call(Observable 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);

更多相关文章

  1. ActionBar简单使用介绍和Tab切换的应用
  2. Android(安卓)Parcelable理解与使用(对象序列化)
  3. Android中传递对象列表的几种方式
  4. 屏幕触点
  5. Java四种引用对比
  6. Android使用ListView构造复杂页面,并响应点击事件,通过intent跳转
  7. android fw systemserver之MountService分析
  8. 跨进程调用Service(AIDL Service)
  9. Android(安卓)ViewGroup事件分发机制

随机推荐

  1. MySQL使用变量实现各种排序
  2. MySQL 消除重复行的一些方法
  3. mysql查询表里的重复数据方法
  4. Mysql一些复杂的sql语句(查询与删除重复
  5. Mac下安装mysql5.7.18的详细步骤
  6. MySQL中的唯一性约束与NULL详解
  7. MySQL产生随机数并连接字符串的方法示例
  8. MySQL数据库操作的基本命令
  9. MySQL常用的建表、添加字段、修改字段、
  10. Mac下MySQL安装配置教程