首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

快速进阶 Kotlin Flow:掌握异步开发技巧

假设我们需要从网络获取用户列表,然后将其存储到 Room 数据库中,最后通过 ViewModel 将数据展示在界面上。...// 从网络请求获取用户列表的函数 suspend fun fetchUsers(): List { // ......协程允许在函数执行过程中挂起,等待某些条件满足后恢复执行。Flow 利用了这一特性来实现数据流的处理。 在 Flow 内部,数据流被建模为一系列的悬挂函数调用。...在 Android 开发中,通常使用 Dispatchers.IO 调度器来执行网络请求等耗时操作,使用 Dispatchers.Main 调度器在主线程中更新界面。...背压处理 RxJava 提供了丰富的背压处理策略,例如缓存、丢弃、最新值等。在处理高频率事件流时,这些策略可以帮助控制数据流的流量。

1.3K30

Carson带你学Android:什么时候应该使用Rxjava?(开发场景汇总)

前言 Rxjava由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。..., 待注册成功后回再继续发送 用户登录 的网络请求 冲突 嵌套实现网络请求较为复杂,即嵌套调用函数 下面展示的是结合 Retrofit 与 RxJava的基本用法,即未用操作符前 // 发送注册网络请求的函数方法...中的变换操作符FlatMap()实现嵌套网络请求 具体实现 Android RxJava 实际应用讲解:网络请求嵌套回调 3.5 从磁盘 / 内存缓存中 获取缓存数据 需求场景 功能说明...对于从磁盘 / 内存缓存中 获取缓存数据 的功能逻辑如下: 具体实现 Android RxJava 实际应用讲解:从磁盘 / 内存缓存中 获取缓存数据 3.6 合并数据源 需求场景...实际应用讲解:联合判断 3.8 线程控制(切换 / 调度 ) 需求场景 即,新开工作线程执行耗时操作;待执行完毕后,切换到主线程实时更新 UI 具体实现 Android RxJava:细说 线程控制

96920
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Android RxJava实际应用案例讲解:使用RxJava的最佳开发场景

    前言 Rxjava由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。...的网络请求, 待注册成功后回再继续发送 用户登录 的网络请求 冲突 嵌套实现网络请求较为复杂,即嵌套调用函数 下面展示的是结合 Retrofit 与 RxJava的基本用法,即未用操作符前...中的变换操作符FlatMap()实现嵌套网络请求 具体实现 Android RxJava 实际应用讲解:网络请求嵌套回调 3.5 从磁盘 / 内存缓存中 获取缓存数据 需求场景 功能说明...对于从磁盘 / 内存缓存中 获取缓存数据 的功能逻辑如下: 具体实现 Android RxJava 实际应用讲解:从磁盘 / 内存缓存中 获取缓存数据 3.6 合并数据源 需求场景 功能说明...实际应用讲解:联合判断 3.8 线程控制(切换 / 调度 ) 需求场景 即,新开工作线程执行耗时操作;待执行完毕后,切换到主线程实时更新 UI 具体实现 Android RxJava:细说 线程控制

    1.4K50

    异步编程 - 01 漫谈异步编程发展史

    同步阻塞编程浪费资源,例如在网络IO请求中,线程会阻塞等待响应,浪费了其它可用资源。...通过异步方式发起网络IO请求,调用线程不会同步阻塞,可以在等待响应时执行其他任务,提高线程利用率。 异步编程可以提供更好的用户体验,允许用户在请求处理中执行其他操作,而不会冻结应用界面。...但是它产生的流只能使用一次,并且缺少与时间相关的操作(例如RxJava中基于时间窗口的缓存元素),虽然可以执行并行计算,但无法指定要使用的线程池。...在同步调用情况下,线程A需要调用服务B,然后同步等待服务B结果返回后,才可以对服务C发起调用,等服务C结果返回后才可以结合服务B和C的结果执行其他操作。...线程A同步获取服务B的结果后,再同步调用服务C获取结果,可见在同步调用情况下业务执行语义比较清晰,线程A顺序地对多个服务请求进行调用 RPC异步调用 但是同步调用意味着当前发起请求的调用线程在远端机器返回结果前必须阻塞等待

    32410

    RxJava 完全解析 是时候来进阶 RxJava 了!

    因此,我们必须正确掌握在Android项目中使用RxJava。 而且我相信: RxJava是一门艺术,无穷无尽的可能性等待着能够掌握它的人。...---- 理解RxJava中的Observable类型 了解RxJava主题 - 发布,重播,行为和异步主题 ---- 学习“如何使用RxJava操作符实现缓存” 缓存在以下情况下非常有用: 减少网络呼叫...:我们可以通过缓存网络响应来减少网络呼叫。...非常快速地获取数据:如果缓存,我们可以非常快速地获取数据。 让我们学习如何使用以下RxJava运算符在Android中实现缓存: Concat运营商 FirstElement运算符 从这里学习。...---- 使用RxJava操作符实现搜索 如今,我们日常生活中使用的大多数应用程序都带有搜索功能,为我们提供了一个快速获取所需内容的工具。因此,拥有搜索功能非常重要。

    1.1K20

    Android应用架构分析(转)

    这些方法使用URLConnection和AsyncTask在一个单独的线程内执行网络请求,然后通过回调将结果返回给Activity。...想象一个简单且常见的场景,应用需要加载一个博客文章列表,然后缓存这些条目到SQLite数据库,最后将他们展示到ListView等列表视图上。...Activity要做到以下几个步骤: 通过APIProvider调用loadPosts方法(回调) 等待APIProvider的回调结果,然后调用CacheProvider中的savePosts...方法(回调) 等待CacheProvider的回调结果,然后将这些文章展示到ListView等列表视图上 分别处理APIProvider和CacheProvider回调中潜在的异常。...另一个常见的情况是,调用loadPosts( )所需要的参数,需要事先从其他地方获取到,比如,需要Play Services SDK提供一个Email地址参数。

    59820

    Android应用架构

    这些方法使用URLConnection和AsyncTask在一个单独的线程内执行网络请求,然后通过回调将结果返回给Activity。...想象一个简单且常见的场景,应用需要加载一个博客文章列表,然后缓存这些条目到SQLite数据库,最后将他们展示到ListView等列表视图上。...Activity要做到以下几个步骤: 通过APIProvider调用loadPosts方法(回调) 等待APIProvider的回调结果,然后调用CacheProvider中的savePosts方法(回调...) 等待CacheProvider的回调结果,然后将这些文章展示到ListView等列表视图上 分别处理APIProvider和CacheProvider回调中潜在的异常。...另一个常见的情况是,调用loadPosts( )所需要的参数,需要事先从其他地方获取到,比如,需要Play Services SDK提供一个Email地址参数。

    1.2K70

    什么是响应式流?

    从调用者和服务提供者的角度来看,阻塞、非阻塞以及同步、异步可以这么理解: 阻塞和非阻塞反映的是调用者的状态,当调用者调用了服务提供者的方法后,如果一直在等待结果返回,否则无法执行后续的操作,那就是阻塞状态...此外,随着微服务架构的日趋火热,各个微服务之间的通信不再像“巨石型”应用中通过对象的引用和方法的调用,而是经由网络传输序列化的数据来实现,网络的延迟也可能造成阻塞。...后者的两个方法分别在异步执行成功 或异常时被调用。 获取到Favorite ID的list后调用第一个服务的回调方法 onSuccess。...由于是测试,我们阻塞住(block()),等待流处理过程结束, 然后直接返回集合。 Assert 结果。...比如我们在做一个监控系统,后台的监控数据以每秒10个的速度产生,而前端界面只需要每秒钟更新一下监控数据即可,那作为发布者的后台就不用缓存数据了,因为这种时效性强的场景,用不到的数据直接丢掉即可。

    2.4K10

    防雪崩利器:熔断器 Hystrix 的原理与使用

    , 比如造成 服务不可用 的原因有: 硬件故障 程序Bug 缓存击穿 用户大量请求 硬件故障可能为硬件损坏造成的服务器主机宕机, 网络硬件故障造成的服务提供者的不可访问....缓存击穿一般发生在缓存应用重启, 所有缓存被清空时,以及短时间内大量缓存失效时. 大量的缓存不命中, 使请求直击后端,造成服务提供者超负荷运行,引起服务不可用....最后, 服务调用者不可用 产生的主要原因是: 同步等待造成的资源耗尽 当服务调用者使用 同步调用 时, 会产生大量的等待线程占用系统资源....改进缓存模式 的措施包括: 缓存预加载 同步改为异步刷新 服务自动扩容 的措施主要有: AWS的auto scaling 服务调用者降级服务 的措施包括: 资源隔离 对依赖服务进行分类 不可用服务的调用快速失败...若线程池接受请求, 则Hystrix开始执行服务调用具体逻辑run方法. 若服务执行失败, 则执行降级服务getFallback方法, 并将执行结果上报Metrics更新服务健康状况.

    1.4K20

    【Dev Club分享】基于RxJava的一种MVP实现

    很多同学可能已经发现了,Presenter层在调用业务层的时候是直接调用的,而Android规定,主线程是无法直接进行网络请求,会抛出NetworkOnMainThreadException异常。...通过新建子线程进行IO读写获取数据,然后通过主线程的Looper将结果通过传回主线程进行展示,这种方案是勉强也行得通的。...RxJava当然不止这么简单,还有别的玩法,比方说进入一个界面的时候,需要先加载缓存的数据,然后再从网络获取更新的数据进行刷新。...下面列出了一些常见的RxJava的常用场景,其实还有更多的其它功能等待着大家去挖掘。...取数据先检查缓存的场景 需要等到多个接口并发取完数据,再更新 一个接口的请求依赖另一个API请求返回的数据 界面按钮需要防止连续点击的情况 响应式的界面 复杂的数据变换 上面这些功能都可以通过RxJava

    97070

    架构原理|服务雪崩效应现象以及处理方法之Hystrix实现

    服务雪崩的每个阶段都可能由不同的原因造成, 比如造成 服务不可用 的原因有: 硬件故障 程序Bug 缓存击穿 用户大量请求 硬件故障可能为硬件损坏造成的服务器主机宕机, 网络硬件故障造成的服务提供者的不可访问...缓存击穿一般发生在缓存应用重启, 所有缓存被清空时,以及短时间内大量缓存失效时. 大量的缓存不命中, 使请求直击后端,造成服务提供者超负荷运行,引起服务不可用....最后, 服务调用者不可用 产生的主要原因是: 同步等待造成的资源耗尽 当服务调用者使用 同步调用 时, 会产生大量的等待线程占用系统资源....改进缓存模式 的措施包括: 缓存预加载 同步改为异步刷新 服务自动扩容 的措施主要有: AWS的auto scaling 服务调用者降级服务 的措施包括: 资源隔离 对依赖服务进行分类 不可用服务的调用快速失败...若线程池接受请求, 则Hystrix开始执行服务调用具体逻辑run方法. 若服务执行失败, 则执行降级服务getFallback方法, 并将执行结果上报Metrics更新服务健康状况.

    1.7K20

    Android MVVM框架搭建(三)MMKV + Room + RxJava2

    正文   本文说的是数据库,为什么要讲这个呢,因为在实际开发中,有一些数据并不需要实时更新,我们只需要在第一次打开应用的时候获取到,然后保存到手机本地数据库中即可,需要的时候从数据库中获取。...当数据要更新是再从服务器获取,这样可以减少请求次数。   ...首先说一下改动思路吧,首先必应每日的壁纸是一样的,因此无论你是请求一次还是多次得到的值都是一样的,因此可以通过一个缓存再来确定设置今天是否有请求过网络接口,有的话再根据一个缓存值判断当前时间是否超过了今天的...getLocalDB(); } else { //大于则数据需要更新,从网络获取...因此就是用RxJava2了,你可能会疑惑之前不是在搭建网络框架的时候就用了RxJava2的线程切换了吗?为什么现在还要重新引入一个库来写呢?

    1.4K31

    RxJava +Retrofit 你需要掌握的几个实用技巧

    RxJava +Retrofit 你需要掌握的几个技巧,Retrofit中OkHttp缓存,统一对有无网络处理, 异常处理,返回结果问题. ?...(Schedulers.io()); 可用在activity的 onDestroy(), Fragment的 onDestroyView()中调用 还有种场景是借助rxJava请求网络数据,需要网络返回后保存数据并更新...UI,这种情况视图已经消亡了必定会导致rxJava出错,导致App闪退,这种我们可以判断前的activity/view是否为空,并是否已showing,如果 两者都不存在,即可无须更新UI。...closeLoadingProgress(); } } 这样我们上层调用时只关心成功和失败即可,无需再关心网络情况 observable..subscribeOn...公共缓存: 有时候需要在无网络时增加缓存功能,因此给Retrofit加入基础拦截器,来处理缓存问题 /** * BaseInterceptor * Created by Tamic on

    89710

    Android MVVM框架搭建(三)MMKV + Room + RxJava2

    正文   本文说的是数据库,为什么要讲这个呢,因为在实际开发中,有一些数据并不需要实时更新,我们只需要在第一次打开应用的时候获取到,然后保存到手机本地数据库中即可,需要的时候从数据库中获取。...当数据要更新是再从服务器获取,这样可以减少请求次数。   ...首先说一下改动思路吧,首先必应每日的壁纸是一样的,因此无论你是请求一次还是多次得到的值都是一样的,因此可以通过一个缓存再来确定设置今天是否有请求过网络接口,有的话再根据一个缓存值判断当前时间是否超过了今天的...getLocalDB(); } else { //大于则数据需要更新,从网络获取...因此就是用RxJava2了,你可能会疑惑之前不是在搭建网络框架的时候就用了RxJava2的线程切换了吗?为什么现在还要重新引入一个库来写呢?

    1.2K20

    Android RxJava 实战系列:从磁盘 内存缓存中 获取缓存数据

    前言 Rxjava,由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。 ?...今天,我将为大家带来 Rxjava中的常见开发应用场景:从磁盘、内存缓存中获取缓存数据 ,希望大家会喜欢。...**/ Observable network = Observable.just("从网络中获取数据"); // 此处仅作网络请求的模拟...Demo地址 Carson_Ho的Github地址 = RxJava2实战系列:从磁盘 / 内存缓存中 获取缓存数据 ---- 5....总结 本文主要讲解了 Rxjava的实际开发需求场景:从磁盘 / 内存缓存中 获取缓存数据 下面我将结合 实际场景应用 & Rxjava的相关使用框架(如Retrofit、Eventbus) ,继续对

    2K10

    一步一步实现Android的MVP框架

    简单来讲,就是 Activity 或者 Fragment 直接与数据层交互,activity 通过 apiProvider 进行网络访问,或者通过 CacheProvider 读取本地缓存,然后在返回或者回调里对...TaskManager 是作为业务层,对获取到的数据进行拼装,然后交给调用层。 这里我们来看看分层的作用 首先来讲业务层 TaskManager,业务层的上层是 View 层,下层是 Data 层。...因为 presenter 层并不知道业务层以及数据层到底是从网络获取数据,还是从本地获取数据(符合层级间相互透明的原则),因为每次调用都可能存在触发这个问题。...rxJava,指定 Schedulers.io() 获取到的线程来执行。...How To Use RxJava RxJava 的使用场景远不止这些,在上面第三篇文章提到了以下几种使用场景: 取数据先检查缓存的场景 需要等到多个接口并发取完数据,再更新 一个接口的请求依赖另一个

    1.5K61

    Carson带你学Android:图文详解RxJava背压策略

    前言 Rxjava,由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。 本文主要讲解的是RxJava中的 背压控制策略,希望你们会喜欢。...,那么具体场景:有很多网络请求需要执行,但执行者的执行速度没那么快,此时就需要使用背压策略来进行控制。...调用emitter.requested()获取当前观察者需要接收的事件数量 Log.d(TAG, "观察者可接收事件数量 = " + emitter.requested(...调用emitter.requested()获取当前观察者需要接收的事件数量 Log.d(TAG, "观察者可接收事件数量 = " + emitter.requested(...具体使用 关于RxJava内部调用request(n)(n = 128、96、0)的逻辑如下: 至于为什么是调用request(128) & request(96) & request(0),感兴趣的读者可自己阅读

    1.2K10
    领券