时间:2021-05-20
本文想阐述一下当你开发Android应用并采用RxJava作为你的架构,尤其是有关网络请求时最常见的三种场景。
我使用Retrofit来作为网络层,简单的内存缓存-HashMap来做缓存,也可以使用Room或者其他数据库实现来替代。
Retrofit接口有如下的一些简单方法,它获取一个事件列表。
通过我的Repository接口来暴露,可订阅如下:
Single<List<Event>> source = remoteRepository.getEventsFeed(...);source.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(data -> { // Do something with data e.g. pass it to a view. }, throwable -> { // Handle error e.g. get view to show dialog. } );下面的例子中,我们将会改变“源”的定义方式,其余代码不变,这也是RxJava的优点之一,可以将复杂的异步任务串连起来,但是执行和观察结果的代码却可以保持不变。
现在说一下开发一个基本或中等复杂应用时会遇到的三种情形。
1.从缓存或者网络获取数据
2.发起两个请求,第二个请求依赖于第一个。
3.同时发起多个请求,并结合他们的结果。
从缓存或者网络获取数据
如果有缓存则从缓存中取值,否则从网络获取。
Maybe<List<Event>> source1 = cacheRepository.getEventsFeed(...);Single<List<Event>> source2 = networkRepository.getEventsFeed(...);Maybe<List<Event>> source = Maybe.concat(source1, source2.toMaybe()).firstElement();这里我们使用concat操作符将两个observable连接在一起,然而firstElement意味着我们只关心第一个发射出来的值。所以如果缓存有值,这个值将会被发射并且调用onCompleted,此值即为返回值。网络请求也将不会被调用,这也是我们所期待的。如果缓存没有值,然后它便会调用onCompleted,此时也没有发射任何一个值。因此网络请求将会发生。使用MayBe暗示着观察不到值的可能,例如,缓存为空且网络也没有返回结果。
发起两个请求,第二个请求依赖于第一个
从网络上取值并使用其部分结果发起另外一个网楼请求来获取真正想要的数据。
Single<User> source1 = networkRepository.getMyProfile(...);Single<List<Tweet>> source = source1.flatMap(user -> { return networkRepository.getUserTweets(user.getTwitterId()); });同时发起多个请求,并结合他们的结果。
我有三个网络请求,它们互不依赖,我想同时执行以提高响应时间。等到三个请求都结束后才发射值。
Single<List<Event>> source1 = networkRepository.getEventsFeed(...);Single<List<Bookmark>> source2 = networkRepository.getBookmarks(...);Single<Stats> source3 = networkRepository.getUserStats(...);Single<MyViewModel> source = Single.zip(source1, source2, source3, MyViewModel::new);这个例子中,我们使用zip操作符来合并这三个Observables.它们被结合为一个MyViewModel的POJO.其构造参数与源Observables的类型匹配
public MyViewModel(List<Event>, List<Bookmark>, Stats) {...}当你订阅这个源Observable时,将会同时发起三个网络请求,但是只有当它们都完成后才将新的MyViewModel实例发射出去。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
一、JS的三种最常见的对话框//======================JS最常用三种弹出对话框========================//弹出对话
简要介绍Retrofit是当前应用非常广泛的网络请求框架,通常结合RxJava来进行网络请求,本文将展示一个采用RxJava+Retrofit的网络请求demo
Go的三种安装方式Go有多种安装方式,你可以选择自己喜欢的。这里我们介绍三种最常见的安装方式:1.Go源码安装:这是一种标准的软件安装方式。对于经常使用Unix
类与类之间最常见的关系主要有三种:依赖(uses-a)、聚合(has-a)和继承(is-a)。下面以在线书店订单系统为例,来详细的讲述这三种关系的概念。在线书店
我们使用缓存的主要目是提升查询速度和保护数据库等稀缺资源不被占满。而缓存最常见的问题是缓存穿透、击穿和雪崩,在高并发下这三种情况都会有大量请求落到数据库,导致数