根据所参考文章,写一写自己对RXjava要点的整理。
Subscriber 比 observer观察者 多出以下两个接口,其他他们都有可以被observable被观察者回调的方法 onNext 触发onCompleted作为结束标志 onCompleted 事件队列完结标志 和 onError 时间队列异常标志
onCompleted和 onError只能够触发一个
根据被观察者创建形式不同 事件队列分发也不一样
1、第一种 create方式
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();
}
2、第二种from方式
String[] words = {"Hello", "Hi", "Aloha"};
Observable observable = Observable.from(words);
// 将会依次调用:
// onNext("Hello");
// onNext("Hi");
// onNext("Aloha");
// onCompleted();
3、
Observable observable = Observable.just("Hello", "Hi", "Aloha");
// 将会依次调用:
// onNext("Hello");
// onNext("Hi");
// onNext("Aloha");
// onCompleted();
onStart() 就不适用了,因为它总是在 subscribe 所发生的线程被调用,而不能指定线程。要在指定的线程来做准备工作,可以使用 doOnSubscribe() 方法,具体可以在后面的文中看到。
观察者
unsubscribe(): 这是 Subscriber 所实现的另一个接口 Subscription 的方法,用于取消订阅。在这个方法被调用后,Subscriber将不再接收事件。一般在这个方法调用前,可以使用 isUnsubscribed() 先判断一下状态。 unsubscribe() 这个方法很重要,因为在 subscribe() 之后, Observable 会持有 Subscriber 的引用,这个引用如果不能及时被释放,将有内存泄露的风险。
释放被 被观察者引用的 接口的方法
Observable.subscribe(Subscriber) 进行提交订阅
不完整形式回调
Action0 对应无参数 无返回值的情况 如可以作为onCompleteAction
Action1 对应有参数 无返回值的情况 可以作为 onErrorAction 和onNextAction
Action2 和 Action3
observable.subscribe(onNextAction)
Observable.subscribe(onNextAction,onErrorAction)
Observable.subscribe(onNextAction,onErrorAction,onCompletedAction)
默认观察者和 被观察者 事件的发出 和 消费是同一个线程的
Scheduler调度器
进行切换线程
分为四种模式
1、schedulers.immediate() 直接当前线程运行,相对于不指定线程
2、schedulers.newThread() 启用新线程,并在新线程中执行操作
3、Schedulers.io() 执行io操作 如 读写文件、读写数据库、网络信息交互
4、Schedulers.computation() 执行cpu密集型计算,但不要放入io操作
5、AndroidSchedulers.mainThread() 操作在主线程中
指定事件发生线程 和 事件回调线程
.subscirbeOn(Schedulers.io());//执行subscribe发生在 io线程,,,被观察者运行线程
.observerOn(AndroidSchedulers.mainThread());//指定subscriber回调发生在主线程,即 观察者回调方法执行的线程
Lift实现机制 添加一层observable事件
将自身 转化为 旧的被观察者的 观察者 ,相当于添加了一层
.map(new Func1<String,Bitmap>()
{
@override
Public Bitmap call(String filePath)
{
Return getBitmapFromPath(filePath);
}
})
//进行 将 string 对象 转化为 bitmap对象变换
而flapMap则可以进行 一个 对象 转变为 多个对象的变换,,,相当于一个学生的课程 汇总到 observabel对象中,再执行分发
Observable.from(students)
.flatMap(new Func1<Student, Observable<Course>>() {
@Override
public Observable<Course> call(Student student) {
//通过 observable.from(对象数组)进行包裹分发对象
return Observable.from(student.getCourses());
}
})
.subscribe(subscriber);
所以对于多级转换我们同样可以,进行 多级 Observable.from包裹变换
对于 多个 observable执行 相同的lift变换的情况
原来是这样的,多级lift变换比较繁琐,需要重复写
observable1
.lift1()
.lift2()
.lift3()
.lift4()
.subscribe(subscriber1);
observable2
.lift1()
.lift2()
.lift3()
.lift4()
.subscribe(subscriber2);
observable3
.lift1()
.lift2()
.lift3()
.lift4()
.subscribe(subscriber3);
observable4
.lift1()
.lift2()
.lift3()
.lift4()
.subscribe(subscriber1);
1、将多级lift变换汇总 应用于 observable
private Observable liftAll(Observable observable) {
return observable
.lift1()
.lift2()
.lift3()
.lift4();
}
…
liftAll(observable1).subscribe(subscriber1);
liftAll(observable2).subscribe(subscriber2);
liftAll(observable3).subscribe(subscriber3);
liftAll(observable4).subscribe(subscriber4);
2、将多级变换 用Transformer汇总应用于 observable变换
public class LiftAllTransformer implements Observable.Transformer<Integer, String> {
@Override
public Observable<String> call(Observable<Integer> observable) {
return observable
.lift1()
.lift2()
.lift3()
.lift4();
}
}
...
Transformer liftAll = new LiftAllTransformer();
observable1.compose(liftAll).subscribe(subscriber1);
observable2.compose(liftAll).subscribe(subscriber2);
observable3.compose(liftAll).subscribe(subscriber3);
observable4.compose(liftAll).subscribe(subscriber4);
subscribeOn 影响本级实现线程
observeOn 在本级执行完成,影响下一级开始实现线程
默认情况下, doOnSubscribe() 执行在 subscribe() 发生的线程;而如果在 doOnSubscribe() 之后有 subscribeOn() 的话,它将执行在离它最近的 subscribeOn() 所指定的线程。
示例代码:
RxBinding 是 Jake Wharton 的一个开源库,它提供了一套在 Android 平台上的基于 RxJava 的 Binding API。所谓 Binding,就是类似设置 OnClickListener 、设置 TextWatcher 这样的注册绑定对象的 API。
举个设置点击监听的例子。使用 RxBinding ,可以把事件监听用这样的方法来设置:
Button button = ...;
RxView.clickEvents(button) // 以 Observable 形式来反馈点击事件
.subscribe(new Action1<ViewClickEvent>() {
@Override
public void call(ViewClickEvent event) {
// Click handling
}
});
看起来除了形式变了没什么区别,实质上也是这样。甚至如果你看一下它的源码,你会发现它连实现都没什么惊喜:它的内部是直接用一个包裹着的 setOnClickListener() 来实现的。然而,仅仅这一个形式的改变,却恰好就是 RxBinding 的目的:扩展性。通过 RxBinding 把点击监听转换成 Observable 之后,就有了对它进行扩展的可能。扩展的方式有很多,根据需求而定。一个例子是前面提到过的 throttleFirst() ,用于去抖动,也就是消除手抖导致的快速连环点击:
RxView.clickEvents(button)
.throttleFirst(500, TimeUnit.MILLISECONDS)
.subscribe(clickAction);
如果想对 RxBinding 有更多了解,可以去它的 GitHub 项目 下面看看。