RxAndroid: управление событиями взаимозависимых объектов - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть 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());
                }
            });

1 Ответ

0 голосов
/ 04 сентября 2018

Я бы попробовал обернуть ваши setText() звонки в if чек.

Если вы введете что-то в TextView A, это значение будет распространено в TextView B, которое затем само обновится. Это, конечно, распространяется на А ... но А в любом случае уже должно иметь это же значение. Таким образом, вы можете проверить и на самом деле вызвать 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 во второй раз, оно будет проигнорировано, и бесконечный цикл будет разорван.

...