RXJAVA

weixin_34189116發表於2017-05-08

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執行緒上的。

相關文章