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

Android rx Java对SwitchMap的误解,得到意想不到的结果

Android RxJava对SwitchMap的误解,得到意想不到的结果。

RxJava是一个基于观察者模式的异步编程库,它提供了丰富的操作符来处理数据流。SwitchMap是其中一个常用的操作符,它可以在数据流中切换并发起新的请求,但是在使用SwitchMap时,有一些常见的误解可能会导致意想不到的结果。

首先,SwitchMap操作符可以将一个Observable转换为另一个Observable,并且只发射最近的Observable的结果。这意味着如果在切换之前,前一个Observable的结果还没有处理完,那么它的结果将被丢弃。这是因为SwitchMap会取消前一个Observable的订阅,只保留最新的Observable。

其次,SwitchMap操作符通常用于处理并发的网络请求,例如在搜索框中输入关键字时,每次输入都会触发一个网络请求。使用SwitchMap可以确保只有最新的请求结果被处理,而忽略之前的请求结果。这样可以避免因为网络延迟导致的结果错乱。

然而,对于一些特殊情况,误用SwitchMap可能会导致意想不到的结果。例如,在一个需要按顺序处理的任务链中使用SwitchMap,可能会导致任务被取消或跳过。这是因为SwitchMap会取消前一个任务的订阅,只保留最新的任务。如果任务之间有依赖关系,那么这种行为可能会导致错误的结果。

另外,SwitchMap还有一些其他的注意事项。例如,如果使用SwitchMap的Observable发射的数据是有限的,那么在切换之后,前一个Observable的未处理数据将会丢失。此外,SwitchMap操作符也可能会导致内存泄漏,因为它会持有最新的Observable的引用,直到它发射了结果或者被取消订阅。

综上所述,SwitchMap是一个强大且常用的RxJava操作符,但是在使用时需要注意其特性和适用场景,避免误解导致意想不到的结果。

腾讯云相关产品和产品介绍链接地址:

  • 云服务器(CVM):提供弹性计算能力,满足各类业务需求。产品介绍
  • 云数据库 MySQL 版(CDB):可扩展的关系型数据库服务,提供高性能和高可用性。产品介绍
  • 人工智能机器学习平台(AI Lab):提供丰富的人工智能开发工具和算法模型,帮助开发者快速构建智能应用。产品介绍
  • 物联网开发平台(IoT Explorer):提供全面的物联网解决方案,帮助连接和管理物联网设备。产品介绍
  • 移动推送服务(信鸽):为移动应用提供消息推送服务,实现实时消息传递。产品介绍
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

明明结果,为什么被合并查询后得到结果却出错了?| Power Query躲坑

最近,有位朋友在一个实际工作问题中,在表2使用合并查询从表1结果中匹配最高(阶段)项,眼看着表1结果,但表2里却得到了错误返回结果,具体情况如图所示: 为什么会这样?...我们先来看表1处理情况。 为了合并查询得到最高阶段项,对表1进行降序排序: 然后通过删除重复项保留最高阶段数据: 从表1结果来看,的确保留了最高阶段数据。...然后,在表2里使用合并查询获取表1中结果并展开: 咦!!! 表1处理结果明明是阶段4(报价),为什么合并查询得到结果却是阶段2(售前)? 这难道是Power QueryBug吗?...这里问题根源其实是表1处理问题,我以往发布多篇文章案例中,在涉及Power Query中使用排序问题时会强调,Power Query排序需要增加添加索引或Table.Buffer步骤,使排序结果真正...所以,回到这个问题,针对表1排序步骤,我们可以嵌套Table.Buffer函数(图中中间行为原排序操作生成代码,无所做任何改变): 这时,我们再看表2结果: 完全正确!

2.4K10

LiveData beyond the ViewModel

多年来,反应式架构一直是Android一个热门话题。它一直是Android会议上一个永恒主题,通常都是用RxJava例子来进行演示(见底部Rx部分)。...缺点是,LiveData并没有像Rx那样提供一个用于组合数据流或管理线程工具包。 如果在一个典型应用程序每一层中使用LiveData,看起来就像这样。...每当资源库有新数据时,ViewModel只需其进行映射即可。...这个场景下,你可以让用户管理器直接调用令牌上传器(或任何架构有意义东西)。 img ❝如果你应用程序一部分不影响用户界面,你可能不需要LiveData。...然而,我们正在泄露所有以前LiveDatas,这些LiveDatas不会再发送更新,所以这是一种浪费。 你可以存储一个引用,然后在添加新源之前将其删除。

1.5K30

5 张弹珠图彻底弄清 RxJS 拉平策略:mergeMap、switchMap、concatMap、exhaustMap

( map(name => http(name)) ) namesObservable.subscribe(result => console.log(`${result}`)) // 则会得到两个...我们可以借助 flatMap 操作符,则能得到同样解析值效果~ flatMap 其实也就是我们熟知 mergeMap 操作符; 代码如下: const { of } = Rx; const { mergeMap...,除了 mergeMap,RxJS 又引入了 switchMap、concatMap 和 exhaustMap,它们能够提供不同方向拉平策略。...; switchMap const { of,interval} = Rx; const { switchMap,take,map } = RxOperators; const namesObservable...(name => http(name)) ) switchMap,在每次发出时,会取消前一个内部 observable 订阅,然后订阅一个新 observable; concatMap const

63020

构建流式应用:RxJS 详解

所以,这里将结合自己 RxJS 理解,通过 RxJS 实现原理、基础实现及实例来一步步分析,提供 RxJS 较为全面的指引,感受下使用 RxJS 编码是怎样体验。...结果后台返回了“爱迪生”搜索结果,执行渲染逻辑后结果框展示了“爱迪生”结果,而不是当前正在搜索“达尔文”,这是不正确。...下雨天时,雨滴随时间推移逐渐产生,下落时水面产生了水波纹影响,这跟 Rx流是很类似的。而在 Web 中,雨滴可能就是一系列鼠标点击、键盘点击产生事件或数据集合等等。...Rx.Observable.prototype.switchMap switchMap 与 mergeMap 都是将分支流疏通到主干上,而不同地方在于 switchMap 只会保留最后流,而取消抛弃之前流...Rx.Observable.prototype.switchMap() 使用 switchMap 替换 mergeMap,将能取消上一个已无用请求,只保留最后请求结果流,这样就确保处理展示是最后搜索结果

7.2K31

给创业码农的话--如何提升开发效率

编者的话:simsun在2013年从手Q转岗到微信,在此非常感谢他微信做出贡献。在我看来,sim是一个活生生全栈工程师,从硬件、后台到iOS、Android样样精通。...原先试用过facebook开源方案Bolts-Android,这个库是parse开源方案。后来有iOS同事推荐Reactive方案,于是就走上了Rx脑残粉不归路。...首先Rx会大大减少你代码量,这一点“懒惰”我们十分重要。 下面举2个平时开发都会遇到问题来举例: 1....搜索界面 我们需要在用户输入完毕后第一时间显示搜索结果,由于这个需要请求后台,我们又不想用户每次输入时候都去后台请求。并且总需要显示当前最新输入内容结果,不能因为网络原因产生乱序结果。...由于Android并不支持Java 8,所以我们需要Retrolambda,来支持lambda表达式。 2.

1.9K70

RxJS速成 (下)

每个订阅者都会从BehaviorSubject那里得到它推送出来初始值和最新值. 用例: 共享app状态....switchMap switchMap把每个值都映射成Observable, 然后使用switch把这些内部Observables合并成一个. switchMap有一部分很想mergeMap, 但也仅仅是一部分像而已...例子:  // 立即发出值, 然后每5秒发出值 const source = Rx.Observable.timer(0, 5000); // 当 source 发出值时切换到新内部 observable...,发出新内部 observable 所发出值 const example = source.switchMap(() => Rx.Observable.interval(500)); // 输出:...: 网速比较慢时候, 客户端发送了多次重复请求, 如果前一次请求在2秒内没有返回的话, 那么就取消前一次请求, 不再需要前一次请求结果了, 这里就应该使用debounceTime配合switchMap

2.1K40

用 RxJS、RxWX 编写微信小程序

Rx.js。Rx.js进行了一些修改使其能在小程序中运行。 RxWX.js。基于Rx.js微信api进行了封装,调用同名API不再使用回调,而是返回Observalbe对象。...使用 小程序API大多数都不是按照纯函数思想设计,把返回结果赋值给入参success、fail、complete属性。...其中Rx.js是可运行在小程序中Rx.js模块,RxWX.js是利用Rx.js小程序API进行封装,封装后API函数将返回Observable对象,属性值不变。...e) => console.error('RxWX发现错误')) .subscribe((resp) => console.log(resp) 在调用同步时RxWX没有太大优势,但在调用异步API时候以流方式来处理结果和异常...这种统一操作方式可以让开发者更好关注业务逻辑,而不需要去分辨API到底是异步还是同步,执行结果到底是在回调中获取还是返回值获取。 这种处理方式是不是让你想起点什么?

2.4K80

RxJava(七) 使用 debounce 操作符优化 App 搜索功能

如果后发出去 AB 请求先返回, A 请求后返回,那么 A 请求后结果将会覆盖 AB 请求结果. 从而导致搜索结果不正确....新请求又去请求 Search 接口.这个时候有可能最后一个请求返回, 第一个请求最后返回,导致最终显示结果是第一次搜索结果....看看官网 switchMap 操作符如何解释: Returns a new Observable by applying a function that you supply to each item...另外,我为 Android 程序员编写了一份:超详细 Android 程序员所需要技术栈思维导图。...如果有需要可以移步我 GitHub -> AndroidAll,里面包含了最全目录和对应知识点链接,帮你扫除 Android 知识点盲区。

1.1K30

使用 Architecture Component 实现 MVVM 正确姿势

答案肯定是否定,但是 Android 给我提供了一套组件,可以让我们更方便地用 MVVM 模式来开发,减少我们重复造轮子工作量 ViewModel ViewModel 是官方提供,用于管理 UI...ViewModelProvider(this).get(MvvmViewModel::class.java) // 或者如果引入了 activity-ktx 或者 fragment-ktx 也可以这样用...因此在使用 LiveData 时候也要特别注意这一点,否则可能引发一些意想不到问题,具体可移步我另一篇文章:LiveData 正确使用姿势以及反模式 非粘性消息实现 网络上和官方博客上都有提到...非粘性消息探索和尝试 LiveData 变换和组合 有时候我们希望 LiveData 做一些变换或者其他处理再提供给 View 层使用,可以使用 Transforms 一静态转换 —— map...理想情况下 ViewModel 中不应该有 Android framework 相关代码,这用对于可测性而言会更加友好(不需要 mock Android 相关代码) 注意内存泄露问题 ViewModel

75320

RxJS速成

Observable: 一系列值生产者 Observer: 它是observable值消费者 Subscriber: 连接observer和observable Operator: 可以在数据流途中值进行转换操作符..., 它结果肯定是一样. pure function不与外界打交道, 不保存到数据库, 不会存储文件, 不依赖于时间.......每个订阅者都会从BehaviorSubject那里得到它推送出来初始值和最新值. 用例: 共享app状态....发出值时切换到新内部 observable,发出新内部 observable 所发出值 const example = source.switchMap(() => Rx.Observable.interval...: 网速比较慢时候, 客户端发送了多次重复请求, 如果前一次请求在2秒内没有返回的话, 那么就取消前一次请求, 不再需要前一次请求结果了, 这里就应该使用debounceTime配合switchMap

4.2K180

如何学习RxJava3?有这个项目就够了!

前言 最近跳槽到了一家新公司, 居然发现这家公司项目大量使用了RxJava3相关技术, 这让我这个Rx系列轻度使用者有些无所适从. 俗话说, 千学不如一看, 千看不如一练....就这样, 我看着文档一遍遍地敲着代码学习, 掌握速度非常迅速. 有RxJava3感兴趣不妨把项目下下来, 本地跑一跑试一试, 效果绝对出乎你想象!...可以看成是RxRunnable。 Maybe 能够发射0或者1个数据,要么成功,要么失败。类似Single和Completable结合。...Android主线程,即UI线程 Plugins 插件,又可称Hook, 可以修改Rxjava默认行为。...我是xuexiangjys,一枚热爱学习,爱好编程,致力于Android架构研究以及开源项目经验分享技术up主。

69320

【译】LiveData三连

例如,如果该Activity是在后台,它将不会得到数据变化通知,直到它再次用户可见。这就意味着不会再有因Activity停止而导致崩溃了。...此外,LiveData还得到了新SQLite持久化库Room支持,该库是作为Android架构组件一部分推出。...即使LiveData提供了Transformations这样工具,它也只有map和switchMap可以帮助你开箱即用。...因此,处理这种需求最好方法是不使用LiveData作为生产者,而是使用RX类型或Kotlin,因为Kotlin支持多种高阶函数以及Collections和Sequence扩展。...你可以使用RX或Kotlincoroutines操作者和线程控制进行更有力控制。LiveData并不能对你线程管理提供完全控制权。

1.6K20

Js 异步处理演进,Callback=u003EPromise=u003EObserver

) ).subscribe(); 详细过程: Observable.from 将一个 Promises 数组转换为 Observable,它是基于 callApiFooA 和 callApiFooB 结果数组...; map — 从 API 函数 A 和 B Respond 中提取 ID; switchMap — 使用前一个结果 id 调用 callApiFooC,并返回一个新 Observable...,新 Observable 是 callApiFooC( resIds ) 返回结果switchMap — 使用函数 callApiFooC 结果调用 callApiFooD; tap...— 获取先前执行结果,并将其打印在控制台中; subscribe — 开始监听 observable; Observable是多数据值生产者,它在处理异步数据流方面更加强大和灵活,它在 Angular...后续会带来 Rx.js Observer 实战~~ 之前文章就提过,惰性求值似乎能连接 js 最重要闭包和异步两个要点,现在看来更是如此,敬请期待~~ 看到这里,不如点个赞吧~ 我是掘金安东尼,公众号同名

2K10

翻译翻译什么 tmd 叫“可读”?RxJS实现“搜索”功能

render(data); } }); },300) }) 吧...'; var text = document.querySelector('#text'); var inputStream = Rx.Observable.fromEvent(text, 'keyup...,则是提取点击 event.target.value switchMap switchMap 要重点理解下; 官方解释是:映射成 observable,完成前一个内部 observable,发出值。...即永远订阅最新Observable; 那么:switchMap = map + switch ,示意如下: 结合理解,在本篇搜索示例中,即用 Http.get(url) 所得 data 值作为事件流最新值...,进行后续传递; 至此,我们可以得出:RxJS 让代码变得十分简洁、可读,前提是,我们熟悉事件流这个东西,熟悉它 API~~ ---- OK,以上便是本篇分享,希望你能有所帮助~觉得不错,给个三连吧

53710

Android Jetpack系列 之LiveData

,最后我们在注册回到onChanged方法中去给Textview赋值就可以了,我们运行程序结果如下: ?...postValue,再次运行结果如下所示: ?...,这就是map转换函数用法 switchMap 我们上面的例子数据获取是直接写在Activity中获取,在真实项目开发中,这里数据一般都是从网络请求中或者缓存中获取,我们来新建HttpUtil...在实际项目开发中我们使用switchMap频率还是很高,毕竟 只要LiveData对象是调用其他方法获取 ,我们就可以这样做, 在点击事件中我们设置了可观察数据:分数,当分数改变时候,就会执行switchMap...函数 ,switchMap会将获取数据转换为可观察LiveData,所以我们监听这个LiveData对象 就可以观察到数据变化了。

1.1K20

竞态问题与RxJs

竞态问题与RxJs 竞态问题通常指的是在多线程编程中,输入了相同条件,但是会输出不确定结果情况。...竞态问题 前边提到了竞态问题通常指的是在多线程编程中,输入了相同条件,但是会输出不确定结果情况。...,如果网络完全没有波动情况下,我们就可以正常按照顺序得到B、C弹窗,但是如果网络波动了呢,假设由于返回B数据包正常在路上阻塞了,而C先返回来了,那么最后得到执行顺序可能就是C、B弹窗了。...在这里只是一个顺序问题,如果我们做搜索时候,更加希望是展示输入最后搜索结果,那么按照上边例,我们希望得到最后输入那个字母下一个字母,也就是顺序输入AB希望得到C,但是却也有可能得到B。...来绑定事件,在这里演示我们是需要自己触发事件了,也就是runner.next,这里最重要一点就是借助了switchMap,他帮助我们管理了在流上顺序,取消了上次回调执行。

1.1K30

你就是函数响应式编程(FRP)啊?!【附 RxJS 实战】

对于函数式编程,我们并不陌生,在 我 JS 专栏 里面可以找到很多相关文章~~ 这里不妨先函数式编程特性做简要回顾: 函数是一等公民(意味着可以把函数赋值给变量或存储在数据结构中,也可以把函数作为其它函数参数或者返回值...OK,说到这里,函数式编程有了一个大体回顾,下面就介绍今天主角 —— 函数响应式编程 正文 从名字上来看,就是多了 响应 二字,什么是“响应”? 各位一定不陌生!...,这种变化将传导到 a; 函数响应式编程(FRP)所做就是:遍历整个事情流集合,将导致 b 和 c 变化事情回放,并获得 a 结果; 【事件流】被称为【被观察者序列】(observable sequences...拖拽实战 再演示一个实战栗子: 实现一个简单拖拽功能; 拖拽功能,可理解为: mousedown, mousemove, mouseup 等多个事件进行观察,并相应地改变小方块位置。...ev.clientX - this.offsetLeft; var relaY = ev.clientY - this.offsetTop; // 获取当前鼠标位置,减去与div相对位置得到当前

80410
领券