软件编程
位置:首页>> 软件编程>> Android编程>> RxJava之网络请求最常见的三种场景

RxJava之网络请求最常见的三种场景

作者:塞上牧羊空许约  发布时间:2023-04-29 19:49:48 

标签:RxJava,网络请求

本文想阐述一下当你开发Android应用并采用RxJava作为你的架构,尤其是有关网络请求时最常见的三种场景。

我使用Retrofit来作为网络层,简单的内存缓存-HashMap来做缓存,也可以使用Room或者其他数据库实现来替代。
Retrofit接口有如下的一些简单方法,它获取一个事件列表。


@GET("events")
Single<List<Event>> getEventsFeed(...);

通过我的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实例发射出去。

来源:https://www.jianshu.com/p/b12c3d5e053c

0
投稿

猜你喜欢

  • 本文实例为大家分享了C#实现图形界面的时钟的具体代码,供大家参考,具体内容如下秒针有跳跃两个格子问题,主要是算法耗时没考虑在TimeTick
  • 本文实例为大家分享了Android实现简单banner轮播图的具体代码,供大家参考,具体内容如下说明:想玩一个简单的轮播图效果 
  • 为了防止测试妹子或者用户频繁点击某个按钮,导致程序在短时间内进行多次数据提交or数据处理,那到时候就比较坑了~那么如何有效避免这种情况的发生
  • List查询JAVA中从数据库中取数据,根据MyBits返回结果主要有两种类型的List,一种是List<Entity>,还一种
  • Java 8 中 Function 接口的介绍Java 8 中提供了一个函数式接口 Function,这个接口表示对一个参数做一些
  • 什么是Drawable首先Drawable是一个抽象类,表示的是可以在Canvas中绘制的图像,常被用作一个view的背景,有多种实现类完成
  • 本文实例为大家分享了flutter实现头部tabTop滚动栏的具体代码,供大家参考,具体内容如下效果图如下:main.dart代码如下:im
  • 本文实例为大家分享了Java Swing实现扫雷源码的具体代码,供大家参考,具体内容如下先来看下效果运行时只需要创建一个GameWindow
  • 本文章是基于鸿洋的Android 自定义View (一) 的一些扩展,以及对Android自定义View构造函数详解里面内容的一些转载。首先
  • 这篇文章主要介绍了MyBatis传入数组集合类并使用foreach遍历,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学
  • 首先,类只能使用public修饰是一个伪命题,应该说我们只见到过使用public修饰的类,还有一些类没有访问修饰符,此时访问权限为defau
  • 概述HashTable是jdk 1.0中引入的产物,基本上现在很少使用了,但是会在面试中经常被问到,你都知道吗:HashTable底层的实现
  • Spring Boot 项目之热部署配置前言所谓热部署,简单来说,就是代码修改后不需重启项目就可自动加载出新的内容。注意:热部署在 debu
  • 本文实例为大家分享了C#实现打字小游戏的具体代码,供大家参考,具体内容如下using System;using System.Drawing
  • 前言最近在学习java8,所以接下来会给大家介绍一系列的Java8学习内容,那么让我们先从lambda表达式开始。众所周知从java8出现以
  • 前言之前采取项目中嵌套html页面,实现基本的登录校验、权限校验、登出操作、记住我等功能试下。但是,现在的开发基本都是前后分离样式,后端并不
  • RESTful 一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设
  • 概念Drawable表示一种可以在Canvas上进行绘制的抽象的概念,它有很多种,常见的如颜色和图片都可以是一个Drawable。优点首先,
  • 一、背景TC 集群具有高可用架构,应用到集群是这样一个间接的关系:应用 -》事务分组 -》TC 集群,应用启动后所指定的事务分组不能变,可通
  • 一、传入dll前,在C#中申请内存空间c#里面的指针即 IntPtr申请如下:IntPtr SrcImgData = Marshal.All
手机版 软件编程 asp之家 www.aspxhome.com