RxAndroid与RxJava 变换

RxJava比较流弊除了线程调度之外,还比较流弊的的方面就是变换

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

看似复杂,简单说就是加工(如一个图片的路径加工得到一张图片)

例子:

    /**
     * 参数类型是drawable id 最终获得drawable图片
     */
    private void mapTest() {
        Observable.just(R.drawable.ic_launcher).map(new Func1<Integer, Drawable>() {
            @Override
            public Drawable call(Integer integer) {
                return getResources().getDrawable(integer);
            }
        }).subscribe(new Action1<Drawable>() {
            @Override
            public void call(Drawable drawable) {
                imageView.setImageDrawable(drawable);
            }
        });
        /**
         * 这里出现了一个叫做Func1的类,它和Action1非常相似,也是RxJava的一个接口,用于包装含有
         * 一个参数的方法,Func1与Action1的区别在于,Func1包装的是有返回值的方法,另外和Action一样,FuncX也有多个
         * 用于不同参数的个数的方法,
         * FuncX与ActionX的区别在于是否含有返回值
         */
    }

以上通过id获取Drawable 将这种变换队形返回的,map() 事件对象的直接变换,这是比较常见的,不过RxJava还可以针对整个事件队列.

flatMap():他可以把传入的参数转换之后返回另外一个对象.

例子:

 /**
     * 打印出每个学生所需要修的所有课程
     */
    private void flatMap() {
        Student[] stus = {new Student(1, 10001), new Student(2, 10002), new Student(3, 10003)};
        Observable.from(stus).flatMap(new Func1<Student, Observable<Course>>() {
            @Override
            public Observable<Course> call(Student student) {
                return Observable.from(student.getCourses());
            }
        }).subscribe(new Subscriber<Course>() {
            @Override
            public void onCompleted() {
                LogUtils.d("----->onCompleted:");
            }

            @Override
            public void onError(Throwable e) {
                LogUtils.d("----->onError:" + e);
            }

            @Override
            public void onNext(Course course) {

                Toast.makeText(SixActivity.this, course.name, Toast.LENGTH_SHORT).show();
                LogUtils.d("----->onNext:" + course.name);
            }
        });

    }

以上的逻辑是打印出了每个学生所选课程

以上我们可以看出,flatMap()和map()有一个相同点:它就是把传入的参数转换之后返回另外一个对象,但是需要注意,map和flatMap不同的,flatMap()中返回的是个Observable对象,并且这个Obserable对象并不是直接发送到了Subscriber的回调方法中

flatMap()的原理是这样的:1:使用传入的事件对象创建一个Observable对象;

2:并不发送这个Observable,而不是将他激活,于是他开始发送事件,

3:每一个创建出来的Obsevable发送的事件,都被汇入了同一个Observable,而这个Observable负责将这些事件同意交给Subsciber的回调方法,这三个步骤,把事件拆分成了两级,通过一组新创建的Observable将初始的对象[铺平]之后通过统一的路径分发下去,而这个[铺平]就是flatmap()所谓udefl;at

RxAndroid与RxJava 变换_第1张图片



你可能感兴趣的:(RxAndroid与RxJava 变换)