android - 如何在 RxJava2/RxKotlin 中正确组合包含点击事件和值的 Observables

标签 android kotlin rx-java rx-java2

我正在努力解决一个 RxJava 用例,需要一些助手。

单击按钮时,我会打开一个对话框让用户选择一个值。对话框需要等于先前选择的值(或默认值)的初始值。我尝试像这样实现它:

Observables.combineLatest(
            RxView.clicks(my_button),
            viewModel.valueObservable
        )
            .subscribe { clickAndValuePair->
                showDialog(
                    initialValue = clickAndValuePair.second
                )
            }

问题是,当选择新值时,对话框会再次打开,因为新值是在此组合的 Observable 中发出的。处理这种情况的最佳做法是什么?

最佳答案

您也许可以使用 zip() 运算符来处理此问题:

Observables.zip(
    RxView.clicks(my_button),
    viewModel.valueObservable
).subscribe {
    showDialog(initialValue = it.second)
}

zip 操作将 observables 的每一个 n 项匹配在一起,因此它总是在发出后等待点击。为此,您需要确保仅更新对话框中的值,并且始终从那里更新它。即使您没有更新任何内容。


一个更好的替代方案可能是只要点击withLatestFrom()就获取最新值。运算符:

RxView.clicks(my_button)
  .withLatestFrom(viewModel.valueObservable)
  .subscribe { showDialog(initialValue = it.second)}

关于android - 如何在 RxJava2/RxKotlin 中正确组合包含点击事件和值的 Observables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56073848/

相关文章:

android - recyclerview:未连接适配器;跳过布局无法查看列表应用程序自行关闭

java - 如何避免 RxJava 2 中的 toBlocking

java - RxJava 发出不同周期的项目

java - 收到 RxJava Debounce 方法调用

kotlin - 在Kotlin中如何定义需要延迟初始化的委托(delegate)属性?

java - 如何使用麦克风在 Android 应用程序中记录声音强度(以分贝为单位)?

android - 如何填充 Canvas 中两个圆圈之间的区域?

android - Android 上的视频无法全屏显示

android - 播放 Youtube 视频时出现错误 "There was a issue with network [400]"

android - 计算 Map<String, Map<String, Int>> 中的元素数量?通过它的 key