在上一部分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變換。過程如下

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)存泄漏等。
參考文章: