通过各种网络搜索, 总结一下
1. 使用场景, 优势何在
EventBus比较适合仅仅当做组件间的通讯工具使用,主要用来传递消息。使用EventBus可以避免搞出一大推的interface,仅仅是为了实现组件间的通讯,而不得不去实现那一推的接口。
RxJava和EventBus一样也是基于观察者模式,但是使用的场景确实异步数据流的处理。比如下面的例子
Observable.from() .map((x) -> x + 1) .filter((x) -> x % 2 == 0) .subscribe()
通过引入函数式的方式来处理数据流,看起来舒服多了。另外RxJava有大量丰富强大的operator,可以满足你的大部分数据处理需求。RxJava另一个强大的地方就是他的scheduler,你可以为Observable和Subscriber指定不同的执行线程,在Android中,你就可以方便的将Observable指定在IO线程中运行,Subscriber在UI线程中运行。
作者:hi大头鬼hi
链接:https://www.zhihu.com/question/32179258/answer/54958212
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
2. RXJava的基本用法
http://www.jianshu.com/u/c50b715ccaeb讲解的甚好
(1)基本原理就是上游发事件, 下游处理.
上游和下游就分别对应着RxJava中的Observable和Observer,它们之间的连接对应subscribe()
(2)观察者和被观察者可以指定不同的线程
(3)map操作符可将上游数据类型进行转换到下游, 比如int转成string, 然后下游接收的就是String
flatmap是无序的,concatMap是有序的,他俩可以将上游的数据进行1对多的改变, 比如Integer 1变成三个字符串下发.
(4)zip用来合并2个上游的事件
(5)filter用来过滤掉上游的一些无用事件, 保证内存稳定
(6)Flowable,Subscriber,BackpressureStrategy, request, 用来避免上游发送过多造成的内存溢出OOM
BackpressureStrategy.ERROR,用来提醒上游过剩, 异步上游存储事件的容量是128, 多了会抛出异常MissingBackpressureException
(7)设置BackpressureStrategy.BUFFER,实现上游容量无限大
BackpressureStrategy.DROP, 扔掉装不下的事件
保留最新的事件BackpressureStrategy.LATEST,
他俩的数量都是128
非自己创建的Flowable, 可以用以下三个函数实现上述功能.
onBackpressureBuffer()
onBackpressureDrop()
onBackpressureLatest()
(8)Flowable可通过requested,获取下游订阅数量.
同步情况下, 下游可以设置上有的requested值.
异步情况下, Flowable默认requested值是128.
当异步下游消耗事件后, 消耗掉异步上游的96个事件, 这时候, 异步上游将requested默认值设置为96
96是个临界点
(9)背压
背压是下游控制上游流速的一种手段。在rxjava1.x的时代,上游会给下游set一个producer,下游通过producer向上游请求n个数据,这样上游就有记录下游请求了多少个数据,然后下游请求多少个上游就给多少个,这个就是背压。一般来讲,每个节点都有缓存,比如说缓存的大小是64,这个时候下游可以一次性向上游request 64个数据。rxjava1.x的有些操作符不支持背压,也就是说这些操作符不会给下游set一个producer,也就是上游根本不理会下游的请求,一直向下游丢数据,如果下游的缓存爆了,那么下游就会抛出MissingBackpressureException,也就是背压失效了。在rxjava2.x时代,上述的背压逻辑全部挪到Flowable里了,所以说Flowable支持背压。而2.x时代的Observable是没有背压的概念的,Observable如果来不及消费会死命的缓存直到OOM,所以rxjava2.x的官方文档里面有讲,大数据流用Flowable,小数据流用Observable