现在说一下开发一个基本或中等复杂应用时会遇到的三种情形。
1.从缓存或者网络获取数据
2.发起两个请求,第二个请求依赖于第一个。
3.同时发起多个请求,并结合他们的结果。
从缓存或者网络获取数据,如果有缓存则从缓存中取值,否则从网络获取。
Maybe> source1 = cacheRepository.getEventsFeed(...);
Single> source2 = networkRepository.getEventsFeed(...);
Maybe> source =Maybe.concat(source1, source2.toMaybe()).firstElement();
这里我们使用concat操作符将两个observable连接在一起,然而firstElement意味着我们只关心第一个发射出来的值。所以如果缓存有值,这个值将会被发射并且调用onCompleted,此值即为返回值。
网络请求也将不会被调用,这也是我们所期待的。如果缓存没有值,然后它便会调用onCompleted,此时也没有发射任何一个值。因此网络请求将会发生。
使用MayBe暗示着观察不到值的可能,例如,缓存为空且网络也没有返回结果。
发起两个请求,第二个请求依赖于第一个
从网络上取值并使用其部分结果发起另外一个网络请求来获取真正想要的数据。
Single source1 =networkRepository.getMyProfile(...);
Single> source = source1.flatMap(user -> {
return networkRepository.getUserTweets(user.getTwitterId());
});
同时发起多个请求,并结合他们的结果。
我有三个网络请求,它们互不依赖,我想同时执行以提高响应时间。等到三个请求都结束后才发射值。
Single> source1 = networkRepository.getEventsFeed(...);
Single> source2 = networkRepository.getBookmarks(...);
Single source3 = networkRepository.getUserStats(...);
Single source = Single.zip(source1, source2, source3, MyViewModel::new);
这个例子中,我们使用zip操作符来合并这三个Observables.它们被结合为一个MyViewModel的POJO.其构造参数与源Observables的类型匹配
public MyViewModel(List, List, Stats) {...}
当你订阅这个源Observable时,将会同时发起三个网络请求,但是只有当它们都完成后才将新的MyViewModel实例发射出去。