RxJava使用总结

     一些对使用RxJava的初级使用总结():
  

   

     

格式说明: 

    • Operator : 表示其是一个Operator操作。
    • Func()表示其是一个函数。

  1. ReactiveX官网: http://reactivex.io/, 建议阅读其Docs,阐述了一些ReactiveX的基本理念和概念:
  2. 一个不错的RxJava Operator的交互示意图: http://rxmarbles.com/, 注意,其上面的Operator种类并不完整

  3. Operator并不神秘,其本质是装饰模式

  4. 对Operator的使用,遵循单一职责原则,在相应的Operator中只做该Operator语义允许的操作,比如,在Map中,你只应该做类型转化相关的操作,而不应该做和其无关的操作(side-effect-operation)。

  5. 如果你发现onNext()中的逻辑还是很复杂,那么很大可能说明是你没有充分利用Operator, 一般来说,onNext()中返回的数据应该是最终并直接可用的数据

  6. 对于不是非常熟悉的RxJava的API,建议先细致阅读其API注释,不要遗漏任何信息,RxJava的很多函数注释在描述中不会提示,但是在下面的参数/throw说明中会提示一些关键点,因此不要遗漏。

  7. 参考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())这种保险的方式来进行。

  8. 应用场景: 在onError()和onNext()中需要做同样的善后工作。
    • 适用doOnTerminate不管消息流最终以onError()/onComplete()结束,都会被调用(类似Java的finally),对于某些需要onError()/onComplete()后都要执行的操作(如网络加载成功/失败都要隐藏载入中界面),可以放在这里。

  9. 应用场景: 在subscribe时需要做一些初始化操作(比如开始加载数据时显示载入中界面)。
    • 适用doOnSubscribe,会在Observable被Subscribe时被调用,适合在里面做一些初始化操作(比如开始加载数据时显示载入中界面)。

  10. doOnUnsubscribe在Observable被unsubscribe()时被调用,可以利用其做一些资源清理工作。

  11. 应用场景: 有时根本不需要关心Observable的onXXX回调,而只是想通过subscribe的方式将Observable运转起来。
    • 适用subscribe(), 不过注意: onError()被触发会导致抛出OnErrorNotImplementedException

  12. 应用场景: 有时候不得不提供一个Action接口对象做占位,又懒的实现时。
    • 适用Actions.empty()

  13. 你迟早需要自己来实现OnSubscribe<T>, 那么OnSubscribeFromArray<T>是个不错的简单参考

  14. 应用场景: 你先需要获得并处理一个Collection(Map/List...), 然后遍历对每个成员进行处理和归总
    • 适用FlatMap,它能将信息流的负载从Collection变为Collection中的成员

  15. RxBindinghttps://github.com/JakeWharton/RxBinding 是一个对Android的View级Reactive适配库,把原来的Listener模式适配为RxJava的消息流模式, 其实现机理很简单,源码可以一看。

  16. 应用场景: 需要对onNext/onError/onComplete做归一化的处理。 
    • 适用materialize,会将onNext()/onError/onComplete统一封装为Notification类型的消息,将Observable转化为一个只传递Notification类型消息的Observable(注意,该Observable最后会触发onComplete(), 但是和被转化的Observable的onComplete()没有任何关系,前者已经被转化为了Notification)。

  17. 应用场景当处理消息流时涉及到Java Class转化或者判定相关的操作。
    • 适用cast和ofType。

  18. 应用场景被动式的Observable已经不能满足你的需求,你需要一个主动发起的消息流。
    • 适用Subject,Subject既是一个Observer,又是一个Observable,因此作为一个Observer,使用者可以主动的调用其onXXX()方法来发起一条消息流,独立于Subscriber的subscribe来驱动消息流的产生。

  19. 应用场景: Subscriber被异步的过程持有引用(类似于异步过程中使用Callback)从而导致即使Subscriber已经UnSubscribe(),Observable仍然持有对Subscriber的引用(不太严格的说法),造成内存泄漏。
    • 适用onTerminateDetach,在UnSubscriber时,Observable对Subscriber的引用会被释放,从而避免了内存泄漏。
       
  20. 应用场景: 在消息流出现onError()时,你希望能够处理onError()这种消息(情况),将其转化为一个onNext()/Observable (比如, 提取数据失败发出onError(),这种情况下可以将预置的数据通过onNext()发出)。
    • 适用onErrorResumeNext,在onError出现的情况下将其转化为一个Obsrervable,相当于开了一条新的消息流。
    • 适用onErrorReturn在onError出现的情况下将其转化为一个onNext()。
    • 上述Operator(其实用的是一个Operator)提供了一种优雅的fallback实现方式
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章