首页
学习
活动
专区
工具
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.7K10

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

    68320

    构建流式应用:RxJS 详解

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

    7.3K31

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

    编者的话: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.5K80

    使用 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

    77620

    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.2K30

    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主。

    73220

    【译】LiveData三连

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

    1.7K20

    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,以上便是本篇分享,希望你能有所帮助~觉得不错,给个三连吧

    55510

    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相对位置得到当前

    84610
    领券