RxJava(新手推薦二)

在上一部分RxJava(新手推薦一),我?guī)Т蠹伊私饬薘xJava的基本結(jié)構(gòu)以及介紹了map()操作符。第二部分,我打算給大家介紹Observable的幾種創(chuàng)建方式以及其他一些操作符。在這一部分,我打算去掉Lamads表達(dá)式,雖然簡(jiǎn)潔但是可讀性感覺并不好(其實(shí)我自己不會(huì),不要拆穿?。?/p>

Observable(被觀察者)的創(chuàng)建方式

1. create

 Observable.create(new Observable.OnSubscribe<String>() {
        @Override
        public void call(Subscriber<? super String> subscriber) {
            subscriber.onNext("hello world1");
            subscriber.onCompleted();
        }
    });

2. just

假如沒有just的創(chuàng)建方式,我們現(xiàn)在要發(fā)出多個(gè)事件,我們?cè)撛趺磳懩兀?/p>

 Observable.create(new Observable.OnSubscribe<String>() {
        @Override
        public void call(Subscriber<? super String> subscriber) {
            subscriber.onNext("hello world1");
            subscriber.onNext("hello world2");
            subscriber.onNext("hello world3");
            subscriber.onCompleted();
        }
    }).subscribe(subscriber);

而有了Just的方式后,我們就可以這么做:

 Observable.just("hello world1","hello world2","hello world3").subscribe(subscriber);

3. from

 String[] hello = {"hello world1",
"hello world2","hello world3"};
Observable.from(hello).subscribe(subscriber);

...其他創(chuàng)建方式

常用操作符(介紹幾個(gè)常用的,入門后其他的可以自己去看)

map:

在發(fā)出事件后,對(duì)Observable發(fā)出的進(jìn)行處理,是一對(duì)一處理,進(jìn)去一個(gè),然后經(jīng)過處理,得到一個(gè)對(duì)應(yīng)的結(jié)果。

    String[] hello = {"hello world1","hello world2","hello world3"};
    Observable.from(hello).map(new Func1<String, String>() {
        @Override
        public String call(String s) {
            return s+" myscrate";
        }
    }).subscribe(subscriber);

filter:

顧名思義,就是過濾器的意思。我們不能將所有傳出的事件一股腦給SubScriber,而是將滿足條件的傳出去即可。多說無益,看例子:

假設(shè)現(xiàn)在有個(gè)Student類:

class Student {

        private int age;
        private String name;

        public Student(){}
        public Student(int age,String name){
            this.name = name;
            this.age = age;
        }
    }

里面有姓名和年齡字段。我們的需求是挑出其中年齡大于20的學(xué)生,假設(shè)就是女生吧,豈不美哉。那么我們?cè)趺醋瞿兀?/p>

先準(zhǔn)備三個(gè)學(xué)生:

     Student stu1 = new Student(18,"nana");
    Student stu2 = new Student(21,"xiaoli");
    Student stu3 = new Student(25,"lixinyu");

指定Subscribe的動(dòng)作(先展示出來供翻牌):

Action1<Student> studentNextAction1 = new Action1<Student>() {
        @Override
        public void call(Student student) {

            System.out.println(student.name+" > 20歲 ");
        }
    };

最后一步,創(chuàng)建Observable并訂閱studentNextAction1。

Observable.just(stu1,stu2,stu3).filter(new Func1<Student, Boolean>() {
        @Override
        public Boolean call(Student student) {
            return student.age > 20 ? true : false;
        }
    }).subscribe(studentNextAction1);

仔細(xì)看中間的處理過程,我們?cè)趂ilter中將年齡大于20歲的返回true,可以傳出到subscribe(觀察者)中。
那么結(jié)果如何呢?

//Output


I/System.out: xiaoli > 20歲

I/System.out: lixinyu > 20歲


目的達(dá)到。

flatMap:

先不說這個(gè)操作符有什么用,來看個(gè)例子就懂了。每個(gè)學(xué)生有好多門課,每門課都有對(duì)應(yīng)的成績(jī)和課程名稱。

class Course{

        private String courseName; //課程名稱
        private int grade; // 成績(jī)

        public Course(){}
        public Course(String courseName,int grade){
            this.courseName = courseName;
            this.grade = grade;
        }
    }

那么我們的學(xué)生類對(duì)應(yīng)就變成如下的:

   class Student {

        private int age;
        private String name;
        private Course[] courses;

        public Student(){}
        public Student(int age,String name,Course[] courses){
            this.name = name;
            this.age = age;
            this.courses = courses;
        }
    }

現(xiàn)在需求來了,將所有學(xué)生考試不及格的科目列出來。
是你你會(huì)怎么做?

你可能會(huì)這么做

     Course[] stu1Courses = {new Course("算法導(dǎo)論",78),new Course("計(jì)算機(jī)網(wǎng)絡(luò)",59),new Course("操作系統(tǒng)",89)};
    Course[] stu2Courses = {new Course("算法導(dǎo)論",21),new Course("計(jì)算機(jī)網(wǎng)絡(luò)",76),new Course("操作系統(tǒng)",87)};
    Course[] stu3Courses = {new Course("算法導(dǎo)論",78),new Course("計(jì)算機(jī)網(wǎng)絡(luò)",54),new Course("操作系統(tǒng)",62)};
    Student stu1 = new Student(18,"nana",stu1Courses);
    Student stu2 = new Student(21,"xiaoli",stu2Courses);
    Student stu3 = new Student(25,"lixinyu",stu3Courses);
    Student[] students = {stu1,stu2,stu3};

    Action1<Student> courseNextAction1 = new Action1<Student>() {
        @Override
        public void call(Student stu) {
            Course[] courses = stu.courses;
            for(int i=0;i<courses.length;i++){

                if(courses[i].grade < 60){
                    System.out.println(stu.name+courses[i].courseName+courses[i].grade);
                }
            }

        }
    };

最后一步,完成訂閱。

Observable.from(students).subscribe(courseNextAction1);

這么寫會(huì)不會(huì)有什么問題?我們可以看到在courseNextAction1做了太多工作,沒傳出來一個(gè)Student都會(huì)執(zhí)行一遍循環(huán)。那么有沒有簡(jiǎn)單點(diǎn)的寫法呢?

    //(1)準(zhǔn)備訂閱者
   Action1<Course> courseNextAction = new Action1<Course>() {
       @Override
       public void call(Course course) {

           if(course.grade < 60){
               System.out.println(course.courseName+":"+course.grade);
           }
       }
   };

//(2)創(chuàng)建Observable并訂閱
 Observable.from(students).flatMap(new Func1<Student, Observable<? extends Course>>() {
        @Override
        public Observable<? extends Course> call(Student student) {
            return Observable.from(student.courses);
        }
    }).subscribe(courseNextAction);

我們分析下上面的寫法,我們首先創(chuàng)建Observable(被觀察者),隨后經(jīng)過flatMap變換。過程如下

flatMap流程

Output


計(jì)算機(jī)網(wǎng)絡(luò):59

算法導(dǎo)論:21

計(jì)算機(jī)網(wǎng)絡(luò):54


....

這一部分主要講了一些常用的操作符以及Observable的幾種不同的創(chuàng)建方式。在下一部分中我將將RxJava中的Schedule以及在使用RxJava的注意事項(xiàng),包括如何避免內(nèi)存泄漏等。

參考文章:

給 Android 開發(fā)者的 RxJava 詳解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本篇文章介主要紹RxJava中操作符是以函數(shù)作為基本單位,與響應(yīng)式編程作為結(jié)合使用的,對(duì)什么是操作、操作符都有哪些...
    嘎啦果安卓獸閱讀 2,994評(píng)論 0 10
  • 我從去年開始使用 RxJava ,到現(xiàn)在一年多了。今年加入了 Flipboard 后,看到 Flipboard 的...
    Jason_andy閱讀 5,777評(píng)論 7 62
  • 前言我從去年開始使用 RxJava ,到現(xiàn)在一年多了。今年加入了 Flipboard 后,看到 Flipboard...
    占導(dǎo)zqq閱讀 9,341評(píng)論 6 151
  • http://blog.csdn.net/yyh352091626/article/details/5330472...
    奈何心善閱讀 3,652評(píng)論 0 0
  • 1 明文黑燈瞎火地摸到二舅舅家敲門,二舅媽端著飯碗趕緊去開門:“是明文啊,快來坐,吃晚飯!”二舅舅、表哥和表嫂也都...
    予未名閱讀 469評(píng)論 0 4

友情鏈接更多精彩內(nèi)容