热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

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

本文想阐述一下当你开发Android应用并采用RxJava作为你的架构,尤其是有关网络请求时最常见的三种场景。这篇文章主要介绍了RxJava之网络请求最常见的三种场景,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

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

@GET("events")
Single> getEventsFeed(...);

通过我的Repository接口来暴露,可订阅如下:

Single> 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> 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实例发射出去。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • YB02 防水车载GPS追踪器
    YB02防水车载GPS追踪器由Yuebiz科技有限公司设计生产,适用于车辆防盗、车队管理和实时追踪等多种场合。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 本文探讨了如何通过最小生成树(MST)来计算严格次小生成树。在处理过程中,需特别注意所有边权重相等的情况,以避免错误。我们首先构建最小生成树,然后枚举每条非树边,检查其是否能形成更优的次小生成树。 ... [详细]
  • ImmutableX Poised to Pioneer Web3 Gaming Revolution
    ImmutableX is set to spearhead the evolution of Web3 gaming, with its innovative technologies and strategic partnerships driving significant advancements in the industry. ... [详细]
  • 汇编语言等号伪指令解析:探究其陡峭的学习曲线
    汇编语言以其独特的特性和复杂的语法结构,一直被认为是编程领域中学习难度较高的语言之一。本文将探讨汇编语言中的等号伪指令及其对初学者带来的挑战,并结合社区反馈分析其学习曲线。 ... [详细]
  • 本文介绍了一段使用jQuery实现的用户注册页面表单验证代码,适用于前端开发人员学习和参考。该示例结合了HTML、CSS和JavaScript,确保用户输入的数据格式正确。 ... [详细]
  • 本文介绍了多个适用于用户界面设计的Canvas框架,帮助开发者选择最适合的工具。 ... [详细]
  • 本文深入分析了 USDC 的稳定性和可能的救援措施,探讨了在硅谷银行破产后 USDC 面临的风险以及行业内的反应。 ... [详细]
  • NVIDIA Titan RTX深度评测
    NVIDIA的Titan RTX被誉为当前最强大的桌面显卡之一,其卓越的性能和高昂的价格吸引了众多专业人士和技术爱好者的关注。本文将详细介绍Titan RTX的技术规格、性能表现及应用场景。 ... [详细]
  • 本文探讨了前端包管理器的核心功能,包括注册机制、文件存储、上传下载、以及依赖分析等关键特性,并介绍了几种流行的前端包管理工具。 ... [详细]
  • Qwik:一款创新的JavaScript框架,致力于提升网页应用的速度与响应性
    Qwik是一款新的JavaScript框架,旨在通过其独特的可恢复性机制,显著提高网页应用的加载速度和用户体验。 ... [详细]
  • Bootstrap与Layui的主要差异分析
    在前端开发领域,Bootstrap与Layui是两种非常流行的框架选择。本文将深入探讨这两种框架的主要区别,帮助开发者根据项目需求做出最佳选择。 ... [详细]
  • 2023年5月20日凌晨5:20(北京时间),由区块链技术和去中心化应用平台ArcBlock(区块基石)研发的ABT钱包移动应用程序,在苹果App Store和Google Play同步上线,标志着用户在数字世界中首次能够完全掌控自己的身份。 ... [详细]
  • 本文探讨了Jeddict工具的应用价值,特别是在快速构建和部署CRUD服务系统方面的能力。通过介绍其核心功能和优势,以及当前的使用状况,文章还展望了Jeddict未来的改进方向。 ... [详细]
  • 利用UserAccountControl 8192 实现域内权限保持
    本文记录了一种通过设置UserAccountControl属性值为8192来添加机器账户并维持域内权限的方法,同时提供了一个基于C语言的工具实现示例。 ... [详细]
author-avatar
明睿崇
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有