RxJava combineLatest源顺序异常:Android双EditText组合显示反向问题
问题原因解析:RxJava
combineLatest 参数顺序与结合函数的对应关系 这个问题本质是对combineLatest的参数映射规则理解出现了偏差,我给你拆解清楚:
核心规则:源顺序与结合函数参数严格对应
combineLatest的核心逻辑是按传入Observable的顺序,将每个源的最新值依次传递给结合函数的参数:
- 第一个传入的Observable,对应结合函数的第一个参数的最新值;
- 第二个传入的Observable,对应结合函数的第二个参数的最新值;
- 这个对应关系只看位置,和你给参数起的名字无关。
你的场景还原
假设你希望EditText1(记为ET1)的文本在前,EditText2(记为ET2)的文本在后,出现顺序颠倒的情况大概率是下面两种错误之一:
错误写法1:结合函数拼接顺序写反
比如你写了这样的代码:
Observable<CharSequence> et1Obs = RxTextView.textChanges(et1); Observable<CharSequence> et2Obs = RxTextView.textChanges(et2); // 源顺序是ET1在前、ET2在后,但拼接时把ET2的内容放前面了 Observable.combineLatest(et1Obs, et2Obs, (et1Text, et2Text) -> et2Text + et1Text) .subscribe(textView::setText);
这里et1Text是ET1的最新值,et2Text是ET2的最新值,但你拼接成了et2Text + et1Text,自然ET2的文本会跑到前面。
为什么交换源顺序就正常了?
当你把源顺序换成ET2在前、ET1在后时:
Observable.combineLatest(et2Obs, et1Obs, (et1Text, et2Text) -> et2Text + et1Text)
此时et1Text变成了ET2的最新值,et2Text变成了ET1的最新值,拼接et2Text + et1Text就等价于ET1文本 + ET2文本,刚好抵消了之前拼接顺序的错误,结果符合预期。
正确的写法
最直观且不易出错的方式是保持源顺序与预期的文本顺序一致,同时结合函数按对应顺序拼接:
Observable.combineLatest(et1Obs, et2Obs, (et1Text, et2Text) -> et1Text + et2Text) .subscribe(textView::setText);
内容的提问来源于stack exchange,提问作者user1409534
相关产品推荐
相关产品推荐

