RxJava 使得线程变得很容易,让我分享一个RxJava的附加好处-如何方便的连接网络
下面有三个场景
1. 网络调用之间的依赖: flatMap
有一种情况:
如图所示, 在很懂情况下您需要进行这种链接操作, 例如, 通过FirstNetwork URL获取网络请求, 然后使用SecondNetwork URL获取另外一个网络请求, Second依赖First请求第二个网络请求.
我们可以使用flatMap
val disposable = firstNetworkCall()
.flatMap{ secondNetworkCall(it) }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { it -> doSomethingWithResonse($it) }
2. 使用mergeWith 合并请求并指向相同的观察者
把不同的任务merge到一起,在所有任务执行完毕并且发送完结果之后,在同一个subscriber里面发送onComplete()
假设我们从两个互不依赖的网络中获取数据,但希望将结果提供给同一观察者。
我们可以使用mergeWith
val disposable = firstNetworkCall()
.mergeWith(secondNetworkCall())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { it -> doSomethingWithIndividualResponse($it) }
这样,将观察来自firstNetworkCall的数据以及观察接下来的secondNetworkCall数据进行mergeWith,最后交于同一观察者观察。
3. 将网络请求组合在一起: zipWith
有时,我们不希望将单个结果发送给观察者,而是希望将它们合并后再发送给观察者。 当我们不必担心观察者端等待和同步时,这将非常有用。
我们可以使用zipWith实现这一目标
val disposable = firstNetworkCall()
.zipWith(secondNetworkCall(),
BiFunction{
firstResonse: ResponseOneType,
secondResponse: ResponseTwoType ->
combineResult(firstResponse, secondResponse) })
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { it -> doSomethingWithCombinedResponse($it) }
与mergeWith非常相似,zipWith函数还接受第一个可观察的链接和第二个可观察的链接。 订阅后,它首先获得firstResponse,之后是secondResponse。 之后,使用BiFunction收集两个结果,然后可以将结果组合起来(例如,一个功能CombineResult),然后再将其传递给Observer。
这三种方式实现方式很不错,但是也有缺点
使用flatMap,mergeWith和zipWith,我们现在可以轻松地链接网络调用,然后再发送给使用它的观察者函数。
这很棒。 但是有一个缺点-它们仍然需要按顺序进行。 例如。 如果firstNetworkCall花费5秒,secondsecondNetworkCall花费5秒,则总过程为到达观察者之前的10秒。
对于场景1,这很有意义,因为一个依赖另一个。 但是对于方案2和3,应该可以同时调用两个网络调用。
查看以下内容,了解如何使其并发执行:
译文链接:
https://levelup.gitconnected.com/rxjava-connecting-network-calls-made-easy-d7b406c9bc66