RxJava

作者: yuansip | 来源:发表于2017-05-08 17:54 被阅读0次

    from vs just

    just内部就是调用的from,但just最多只能接受9个参数

    map vs flatmap

    1. mapflatmap返回的都是Observable
    2. flatmap的参数FuncX的最后一个模板参数必须是从Observable派生,也就是flatmap实际返回的类型;而map的参数FuncX的最后一个模板参数则和map返回的Observable的模板参数是一致的
    3. 如果是1对1的转换,则mapflatmap都可以。
    4. 如果是1对多的转换,则应该使用flatmap,这是因为mapFuncX返回的不是Observable, 没有办法实现1对多;而flatmapFuncX返回的是ObservableFuncX内部可以返回Observable.from(...),实现1对多的转换,例如:

    【Android】RxJava的使用(三)转换——map、flatMap

    /**
         * 学生类
         */
        class Student {
            private String name;//姓名
            private List<Course> coursesList;//所修的课程
            ...
        }
        /**
         * 课程类
         */
        class  Course {
            private String name;//课程名
            private String id;
            ...
        }
    

    如果使用map来实现打印所有学生所修个课程名,实现的代码是这样的:

    List<Student> students = new ArrayList<Student>();
            students.add...
            ...
            Action1<List<Course>> action1 = new Action1<List<Course>>() {
                @Override
                public void call(List<Course> courses) {
                    //遍历courses,输出cuouses的name
                     for (int i = 0; i < courses.size(); i++){
                        Log.i(TAG, courses.get(i).getName());
                    }
                }
            };
            Observable.from(students)
                    .map(new Func1<Student, List<Course>>() {
                        @Override
                        public List<Course> call(Student student) {
                            //返回coursesList
                            return student.getCoursesList();
                        }
                    })
                    .subscribe(action1);
    

    可以看到,在Action1中出现了for来循环打印课程名,使用RxJava就是为了剔除这样的嵌套结构,使得整体的逻辑性更强。这时候就可以使用flatMap了,使用flatMap实现的代码是这样的:

    List<Student> students = new ArrayList<Student>();
            students.add...
            ...
            Observable.from(students)
                    .flatMap(new Func1<Student, Observable<Course>>() {
                        @Override
                        public Observable<Course> call(Student student) {
                            return Observable.from(student.getCoursesList());
                        }
                    })
                    .subscribe(new Action1<Course>() {
                        @Override
                        public void call(Course course) {
                            Log.i(TAG, course.getName());
                        }
                    });
    

    这样就实现了跟上面代码一样的效果。

    Thread

    1. 如果利用subscribeOn指定了subscribe线程(事件产生的线程),则诸如map,filter,take等操作符都是在subscribe线程上运行的。
    2. 如果指定了subscribe线程,但没有利用observeOn指定observe线程(事件消费的线程),则observer的action都是运行在subscribe线程上的。

    相关文章

      网友评论

          本文标题:RxJava

          本文链接:https://www.haomeiwen.com/subject/uiqvtxtx.html