RxAndroid:管理相互依赖对象的事件
RxAndroid: Manage events of interdependent objects
我有 2 个 editText 字段 editText1 和 editText2。
当用户更改其中任何一个的内容时,我正在使用 Reactive 进行捕获。
发生这种情况时,我想将第一个字段的值复制到另一个字段,反之亦然(使它们相互依赖)。
问题是当我更新第二个字段时,触发了一个新事件,第二个字段的使用者尝试更新第一个字段。这导致无限递归。
我需要的是只考虑来自用户的事件,而不是我在消费者中执行的来自 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的时候会忽略掉,死循环就被打破了。
我有 2 个 editText 字段 editText1 和 editText2。
当用户更改其中任何一个的内容时,我正在使用 Reactive 进行捕获。
发生这种情况时,我想将第一个字段的值复制到另一个字段,反之亦然(使它们相互依赖)。
问题是当我更新第二个字段时,触发了一个新事件,第二个字段的使用者尝试更新第一个字段。这导致无限递归。
我需要的是只考虑来自用户的事件,而不是我在消费者中执行的来自 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的时候会忽略掉,死循环就被打破了。