一些对使用RxJava的初级使用总结():
格式说明:
-
- Operator : 表示其是一个Operator操作。
- Func():表示其是一个函数。
- ReactiveX官网: http://reactivex.io/, 建议阅读其Docs,阐述了一些ReactiveX的基本理念和概念:
- 对Observable的解释和定位: http://reactivex.io/documentation/observable.html
- 对Operator的罗列,任何时候,当你觉得有些需求用已知的Operator不能优雅解决时,可以看看这个:http://reactivex.io/documentation/operators.html
- Single是一种Observable的特殊变种,其只提供了onSuccess和onError两种消息,并且只会发一次,适用于某些特殊的场景(Eg, one-shot):http://reactivex.io/documentation/single.html
- Subject像是一种桥接器,既是Observer又是Observable: http://reactivex.io/documentation/subject.html
- Scheduler是RxJava线程优雅的一个体现:http://reactivex.io/documentation/scheduler.html
- 一个不错的RxJava Operator的交互示意图: http://rxmarbles.com/, 注意,其上面的Operator种类并不完整。
- Operator并不神秘,其本质是装饰模式。
- 对Operator的使用,遵循单一职责原则,在相应的Operator中只做该Operator语义允许的操作,比如,在Map中,你只应该做类型转化相关的操作,而不应该做和其无关的操作(side-effect-operation)。
- 如果你发现onNext()中的逻辑还是很复杂,那么很大可能说明是你没有充分利用Operator, 一般来说,onNext()中返回的数据应该是最终并直接可用的数据。
- 对于不是非常熟悉的RxJava的API,建议先细致阅读其API注释,不要遗漏任何信息,RxJava的很多函数注释在描述中不会提示,但是在下面的参数/throw说明中会提示一些关键点,因此不要遗漏。
- 参考http://gitlab.renrenche.com/android/carapp/issues/1055,对subscribe(final Action1<? super T> onNext)要慎重使用,该函数会在Observable调用onError()时强制抛出OnErrorNotImplementedException(参见其底部注释),从源码上可以看出其如果只提供了onNext的处理,那么onError的处理会被设置为InternalObservableUtils.ERROR_NOT_IMPLEMENTED(ErrorNotImplementedAction的实例),该函数在执行call时会直接抛出OnErrorNotImplementedException(t)异常。考虑到现在我们整体对RxJava的运用还停留在初级,因此建议对任何的subscribe(...)都使用subscribe(new Subscriber())这种保险的方式来进行。
- 应用场景: 在onError()和onNext()中需要做同样的善后工作。
- 适用doOnTerminate,不管消息流最终以onError()/onComplete()结束,都会被调用(类似Java的finally),对于某些需要onError()/onComplete()后都要执行的操作(如网络加载成功/失败都要隐藏载入中界面),可以放在这里。
- 适用doOnTerminate,不管消息流最终以onError()/onComplete()结束,都会被调用(类似Java的finally),对于某些需要onError()/onComplete()后都要执行的操作(如网络加载成功/失败都要隐藏载入中界面),可以放在这里。
- 应用场景: 在subscribe时需要做一些初始化操作(比如开始加载数据时显示载入中界面)。
- 适用doOnSubscribe,会在Observable被Subscribe时被调用,适合在里面做一些初始化操作(比如开始加载数据时显示载入中界面)。
- 适用doOnSubscribe,会在Observable被Subscribe时被调用,适合在里面做一些初始化操作(比如开始加载数据时显示载入中界面)。
- doOnUnsubscribe在Observable被unsubscribe()时被调用,可以利用其做一些资源清理工作。
- 应用场景: 有时根本不需要关心Observable的onXXX回调,而只是想通过subscribe的方式将Observable运转起来。
- 适用subscribe(), 不过注意: onError()被触发会导致抛出OnErrorNotImplementedException。
- 适用subscribe(), 不过注意: onError()被触发会导致抛出OnErrorNotImplementedException。
- 应用场景: 有时候不得不提供一个Action接口对象做占位,又懒的实现时。
- 适用Actions.empty()。
- 适用Actions.empty()。
- 你迟早需要自己来实现OnSubscribe<T>, 那么OnSubscribeFromArray<T>是个不错的简单参考。
- 应用场景: 你先需要获得并处理一个Collection(Map/List...), 然后遍历对每个成员进行处理和归总。
- 适用FlatMap,它能将信息流的负载从Collection变为Collection中的成员。
- 适用FlatMap,它能将信息流的负载从Collection变为Collection中的成员。
- RxBindinghttps://github.com/JakeWharton/RxBinding 是一个对Android的View级Reactive适配库,把原来的Listener模式适配为RxJava的消息流模式, 其实现机理很简单,源码可以一看。
- 应用场景: 需要对onNext/onError/onComplete做归一化的处理。
- 适用materialize,会将onNext()/onError/onComplete统一封装为Notification类型的消息,将Observable转化为一个只传递Notification类型消息的Observable(注意,该Observable最后会触发onComplete(), 但是和被转化的Observable的onComplete()没有任何关系,前者已经被转化为了Notification)。
- 适用materialize,会将onNext()/onError/onComplete统一封装为Notification类型的消息,将Observable转化为一个只传递Notification类型消息的Observable(注意,该Observable最后会触发onComplete(), 但是和被转化的Observable的onComplete()没有任何关系,前者已经被转化为了Notification)。
- 应用场景: 当处理消息流时涉及到Java Class转化或者判定相关的操作。
- 适用cast和ofType。
- 适用cast和ofType。
- 应用场景: 被动式的Observable已经不能满足你的需求,你需要一个主动发起的消息流。
- 适用Subject,Subject既是一个Observer,又是一个Observable,因此作为一个Observer,使用者可以主动的调用其onXXX()方法来发起一条消息流,独立于Subscriber的subscribe来驱动消息流的产生。
- 适用Subject,Subject既是一个Observer,又是一个Observable,因此作为一个Observer,使用者可以主动的调用其onXXX()方法来发起一条消息流,独立于Subscriber的subscribe来驱动消息流的产生。
- 应用场景: Subscriber被异步的过程持有引用(类似于异步过程中使用Callback)从而导致即使Subscriber已经UnSubscribe(),Observable仍然持有对Subscriber的引用(不太严格的说法),造成内存泄漏。
- 适用onTerminateDetach,在UnSubscriber时,Observable对Subscriber的引用会被释放,从而避免了内存泄漏。
- 适用onTerminateDetach,在UnSubscriber时,Observable对Subscriber的引用会被释放,从而避免了内存泄漏。
- 应用场景: 在消息流出现onError()时,你希望能够处理onError()这种消息(情况),将其转化为一个onNext()/Observable (比如, 提取数据失败发出onError(),这种情况下可以将预置的数据通过onNext()发出)。
-
- 适用onErrorResumeNext,在onError出现的情况下将其转化为一个Obsrervable,相当于开了一条新的消息流。
- 适用onErrorReturn, 在onError出现的情况下将其转化为一个onNext()。
- 上述Operator(其实用的是一个Operator)提供了一种优雅的fallback实现方式