最近在研究RxJava自定义操做符的实现原理,发现成型的项目案例较少。忽然想起在项目中应用的RxLifecycle是使用自定义操做符,便拿来研究了一下。分析以前,跟你们了解一些相关操做符和RxLifecycle
工具包的做用。java
用来严格控制因为发布了一个订阅后,没有及时取消,致使Activity/Fragment没法销毁致使的内存泄露。使用方式参考官方github说明,这里不作重点说明。git
这里是稍微重点介绍一下几个操做符,方便对RxLifecycle实现原理的理解。github
组合操做符,建立一个自定义的操做符与Transformer配合使用,将原始Observable进行变换操做、内联其余操做符等。ide
自定义操做符变换器,实现方式以下:工具
public class MyTransformer<T> implements Observable.Transformer<T, T> { @Override public Observable<T> call(Observable<T> source) { //定义变换规则 return source.map(new Func1<T, T>() { @Override public T call(T t) { return t; } }).subscribeOn(Schedulers.io()); } }
BehaviorSubject是Subject的用途之一。Subject
在ReactiveX是做为observer和observerable的一个bridge。由于它是一个观察者,因此它能够订阅一个或多个可观察对象,同时由于他是一个可观测对象,因此它能够传递和释放它观测到的数据对象,而且能释放新的对象。code
BehaviorSubject,它一开始就会释放Observable最近释放的一个数据对象,当尚未任何数据释放时,它则是一个默认值。接下来就会释放Observable释放的全部数据。若是Observable因异常终止,BehaviorSubject将不会向后续的Observer释放数据,可是会向Observer传递一个异常通知。orm
BehaviorSubject<Integer> subject = BehaviorSubject.create(); subject.onNext(1); subject.onNext(2); subject.subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d(Utils.TAG, "integer : " + integer); } }); subject.onNext(3);
执行结果server
04-26 17:20:15.796 16908-16908/qulei.rxjava.demo D/RxJava: integer : 2 04-26 17:20:15.796 16908-16908/qulei.rxjava.demo D/RxJava: integer : 3