RxJava(新手推荐二)

在上一部分RxJava(新手推荐一),我带大家了解了RxJava的基本结构以及介绍了map()操作符。第二部分,我打算给大家介绍Observable的几种创建方式以及其他一些操作符。在这一部分,我打算去掉Lamads表达式,虽然简洁但是可读性感觉并不好(其实我自己不会,不要拆穿啊)。

Observable(被观察者)的创建方式

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的创建方式,我们现在要发出多个事件,我们该怎么写呢?

 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);

...其他创建方式

常用操作符(介绍几个常用的,入门后其他的可以自己去看)

map:

在发出事件后,对Observable发出的进行处理,是一对一处理,进去一个,然后经过处理,得到一个对应的结果。

    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,而是将满足条件的传出去即可。多说无益,看例子:

假设现在有个Student类:

class Student {

        private int age;
        private String name;

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

里面有姓名和年龄字段。我们的需求是挑出其中年龄大于20的学生,假设就是女生吧,岂不美哉。那么我们怎么做呢?

先准备三个学生:

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

指定Subscribe的动作(先展示出来供翻牌):

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

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

最后一步,创建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);

仔细看中间的处理过程,我们在filter中将年龄大于20岁的返回true,可以传出到subscribe(观察者)中。
那么结果如何呢?

//Output


I/System.out: xiaoli > 20岁

I/System.out: lixinyu > 20岁


目的达到。

flatMap:

先不说这个操作符有什么用,来看个例子就懂了。每个学生有好多门课,每门课都有对应的成绩和课程名称。

class Course{

        private String courseName; //课程名称
        private int grade; // 成绩

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

那么我们的学生类对应就变成如下的:

   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;
        }
    }

现在需求来了,将所有学生考试不及格的科目列出来。
是你你会怎么做?

你可能会这么做

     Course[] stu1Courses = {new Course("算法导论",78),new Course("计算机网络",59),new Course("操作系统",89)};
    Course[] stu2Courses = {new Course("算法导论",21),new Course("计算机网络",76),new Course("操作系统",87)};
    Course[] stu3Courses = {new Course("算法导论",78),new Course("计算机网络",54),new Course("操作系统",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);

这么写会不会有什么问题?我们可以看到在courseNextAction1做了太多工作,没传出来一个Student都会执行一遍循环。那么有没有简单点的写法呢?

    //(1)准备订阅者
   Action1<Course> courseNextAction = new Action1<Course>() {
       @Override
       public void call(Course course) {

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

//(2)创建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);

我们分析下上面的写法,我们首先创建Observable(被观察者),随后经过flatMap变换。过程如下

flatMap流程

Output


计算机网络:59

算法导论:21

计算机网络:54


....

这一部分主要讲了一些常用的操作符以及Observable的几种不同的创建方式。在下一部分中我将将RxJava中的Schedule以及在使用RxJava的注意事项,包括如何避免内存泄漏等。

参考文章:

给 Android 开发者的 RxJava 详解

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容

  • 本篇文章介主要绍RxJava中操作符是以函数作为基本单位,与响应式编程作为结合使用的,对什么是操作、操作符都有哪些...
    嘎啦果安卓兽阅读 2,819评论 0 10
  • 我从去年开始使用 RxJava ,到现在一年多了。今年加入了 Flipboard 后,看到 Flipboard 的...
    Jason_andy阅读 5,435评论 7 62
  • 前言我从去年开始使用 RxJava ,到现在一年多了。今年加入了 Flipboard 后,看到 Flipboard...
    占导zqq阅读 9,156评论 6 151
  • http://blog.csdn.net/yyh352091626/article/details/5330472...
    奈何心善阅读 3,539评论 0 0
  • 1 明文黑灯瞎火地摸到二舅舅家敲门,二舅妈端着饭碗赶紧去开门:“是明文啊,快来坐,吃晚饭!”二舅舅、表哥和表嫂也都...
    予未名阅读 368评论 0 4