记录初学RXJava时的总结(其实后面会发现这些只是API的使用,还是要理解原理以及为什么!
RXJava的异步实现————观察者模式 Observable (可观察者,即被观察者)、 Observer / Subscriber(观察者) 、 subscribe (订阅)、事件 Observable ————>onEvent(params)————>Observer Observable发出事件通知Observer
Observable.from(folders)
.flatMap(new Func1<File, Observable<File>>() {
@Override
public Observable<File> call(File file) {
return Observable.from(file.listFiles());
}
})
.filter(new Func1<File, Boolean>() {
@Override
public Boolean call(File file) {
return file.getName().endsWith(".png");
}
})
.map(new Func1<File, Bitmap>() {
@Override
public Bitmap call(File file) {
return getBitmapFromFile(file);
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Bitmap>() {
@Override
public void call(Bitmap bitmap) {
imageCollectorView.addImage(bitmap);
}
});
A对象(观察者)对B对象(被观察者)的某种变化高度敏感,需要在B变化一瞬间做出反应(警察抓小偷) 但观察者不需要时刻盯着被观察者(A不需要每过2ms就检查一次B的状态)而是采用注册或订阅的方式,告诉被观察者:我需要你的某某状态,你在变化时通知我!!! 典型例子就是Android中的OnClickListener: 对设置OnClickListener来说,View是被观察者,OnClickListener是观察者,二者通过setOnClickListener()达成订阅关系。 既省去了反复检索状态的资源消耗,也提高了反馈速度 当用户点击时,Button 自动调用 OnClickListener 的 onClick() 方法(Button -> 被观察者、OnClickListener -> 观察者、setOnClickListener() -> 订阅,onClick() -> 事件)
RXJava有四个基本概念:Observable(被观察者),Observer(观察者),subscribe(订阅),事件 Observable和Observer通过subscribe()方法实现订阅关系;从而Observable可在需要时发出事件来通知Observer。 与传统观察者模式不同,RXJava的事件回调除了:
还定义了两个特殊的事件:onCompleted()和onError()
Observer<String> observer = new Observer<String>() {
@Override
public void onNext(String s) {
Log.d(tag, "Item: " + s);
}
@Override
public void onCompleted() {
Log.d(tag, "Completed!");
}
@Override
public void onError(Throwable e) {
Log.d(tag, "Error!");
}
};
Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Hello");
subscriber.onNext("Hi");
subscriber.onNext("Aloha");
subscriber.onCompleted();
}
});
传入一个OnSubscribe对象作为参数。OnSubscribe会被存储在返回的Observable对象中,它的作用相当于一个计划表,当Observable被订阅时,OnSubscribe的call()方法会自动被调用,事件序列就会按照设定依次触发(对于上面的例子就是触发三次onNext()和一次OnComplete) 这样由被观察者调用了观察者的回调方法,就实现了由被观察者向观察者的事件传递,即观察者模式!!!
create()方法是RXJava最基本的创造事件序列的方法。基于这个方法,RXJava还提供了一些方法用来快捷创建事件队列:
Observable observable = Observable.just("Hello", "Hi", "Aloha");
String[] words = {"Hello", "Hi", "Aloha"};
Observable observable = Observable.from(words);
// 将会依次调用:
// onNext("Hello");
// onNext("Hi");
// onNext("Aloha");
// onCompleted();
—just(T…)和from(T[]),都和之前create(OnSubscribe)等价
public Subscription subscribe(Subscriber subscriber) {
subscriber.onStart();
onSubscribe.call(subscriber);
return subscriber;
}
除了subscribe(Observer) 和 subscribe(Subscriber),subscribe() 还支持不完整定义的回调,RxJava 会自动根据定义创建出 Subscriber
在不指定线程的情况下,RXJava遵循的是线程不变原则:在哪个线程调用subscribe(),就在哪个线程生产事件,在哪个线程生产事件,就在哪个线程消费事件!!! 如果需要切换线程就需要用到Schedule(调度器)!!!
将事件序列中的对象或整个序列进行加工处理,转换成不同的事件或事件序列 map():事件对象的直接变换,把传入的参数转化之后返回另一个对象,一对一的转化 flatMap():都是把传入参数转化成另一个对象,不同是flatMap()返回是个Observable对象,并且这个Observable并不是直接发到了Subscriber中。一对多的转化 flatMap原理:
Student[] students = ...;
Subscriber<Course> subscriber = new Subscriber<Course>() {
@Override
public void onNext(Course course) {
Log.d(tag, course.getName());
}
...
};
Observable.from(students)
.flatMap(new Func1<Student, Observable<Course>>() {
@Override
public Observable<Course> call(Student student) {
return Observable.from(student.getCourses());
}
})
.subscribe(subscriber);
变换原理:实质上都是针对事件序列的处理和再发送
compose:对Observable整体的变换
多次切换线程。observeOn()指的是Subscriber的线程,而这个Subscriber并不是subscribe()参数参数中的Subscriber,而是observeOn()执行时的当前Observable所对应的Subscriber,即它的下级Subscriber。换句话说,observeOn()指定的是它之后的操作所在的线程 不同于observeOn(),subscribeOn()的位置放哪都行,但是只能调用一次!!!使用多个时,只有第一个起作用!!!
doOnSubscribe(): 等同onStart(),但是可以指定线程