android - RxAndroid : Manage events of interdependent objects

标签 android rx-java rx-android

我有 2 个 editText 字段 editText1 和 editText2。

当用户更改其中任何一个的内容时,我正在使用 Reactive 进行捕获。

发生这种情况时,我想将第一个字段的值复制到另一个字段,反之亦然(使它们相互依赖)。

问题是,当我更新第二个字段时,会触发一个新事件,第二个字段的使用者会尝试更新第一个字段。这会导致无限递归。

我需要的是只考虑来自用户的事件,而不是来 self 在消费者中执行的 setText 的事件。

    RxTextView.textChanges(editText1)
            .subscribe(new Consumer<CharSequence>() {
                @Override
                public void accept(CharSequence e) throws Exception {
                    editText2.setText(editText1.getText());
                }
            });

    RxTextView.textChanges(editText2)
            .subscribe(new Consumer<CharSequence>() {
                @Override
                public void accept(CharSequence charSequence) throws Exception {
                    editText1.setText(editText2.getText());
                }
            });

最佳答案

我会尝试将您的 setText() 调用包装在 if 检查中。

如果您在 TextView A 中键入内容,该值将传播到 TextView B,然后后者将自行更新。这当然会传播回 A... 但无论如何 A 应该已经具有相同的值。因此您可以检查并仅在值不同时实际调用 setText()

public void accept(CharSequence charSequence) throws Exception {
    String before = editText1.getText().toString();
    String after = editText2.getText().toString();

    if (!before.equals(after)) {
        editText1.setText(after);
    }
}

所以这仍然是A -> B -> A,但是当值第二次返回到A时,它将被忽略,无限循环将被打破。

关于android - RxAndroid : Manage events of interdependent objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52173776/

相关文章:

java - 如何正确删除Android中按钮周围的填充(或边距?)?

java - 有条件地订阅 rxJava2 Observable

android - 如何在 RxJava2 中使用带有 lambda 表达式的 DisposableObserver

java - 如何在 RxJava2 中的自定义 Observable 中获取观察者的 dispose 操作的通知

android - 在 onDoNext 和 doOnCompleted 方法中难以设置 View

android - Flowable 的两个序列没有到达 toList()

java - 从布局捕获按钮时意外停止错误

android - 如何在应用程序图标或小部件中显示徽章计数

java - android tess-two OCR加速和错误

java - RxJava retryWhen 重新订阅传播