Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
 Аватар для arvalon
22 / 7 / 2
Регистрация: 26.10.2012
Сообщений: 212
Записей в блоге: 1
1

RXJava как скомбинировать два Observable так что бы один прерывал другой?

13.09.2019, 15:01. Показов 693. Ответов 6

Author24 — интернет-сервис помощи студентам
Доброго для.
Есть задача. Имеем EditText, необходимо получать из него вводимые значения по нажатию кнопки Enter (Go) на клавиатуре ИЛИ по истечении определённого времени. Если нажатие по клавиатуре было произведено до истечения таймаута - отбрасывать дублирующую отправку введённого текста. Сделать Observable для каждой отдельной комбинации получилось, но соединить всё вместе не удаётся.

Итак, имеется EditText:
Кликните здесь для просмотра всего текста
Java
1
2
3
EditText ed = findViewById(R.id.edit_text);
ed.setImeOptions(EditorInfo.IME_ACTION_GO);
ed.setInputType(EditorInfo.IME_ACTION_GO);


Observable, выпускающий события нажатия на Go:

Java
1
2
3
Observable<CharSequence> editorActionObservable = RxTextView.editorActionEvents(ed)
                .filter(predicate)
                .map(event -> ed.getText());
Функция-предикат, пропускающая только нажатия на Go на экранной клавиатуре или Enter на аппаратной (если она есть, это условие задачи), переданная в фильтр Observable'выше
Java
1
2
3
4
Predicate<TextViewEditorActionEvent> predicate = (event ->
                event.actionId() == EditorInfo.IME_ACTION_GO
                || (event.keyEvent().getKeyCode() == KeyEvent.KEYCODE_ENTER
                && event.keyEvent().getAction() == KeyEvent.ACTION_UP ));
Второй Observable, основанный на изменениях текста в текстовом поле и выпускающий события с таймаутом, объединяется с первым Observable'ом Action-событий GO с помощью mergeWith(editorActionObservable).

Java
1
2
3
4
5
6
Disposable textChangedEvent =  RxTextView.textChanges(ed)
                .debounce(2, TimeUnit.SECONDS)
                .filter(text -> text.length() > 2)
                .mergeWith(editorActionObservable)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(charSequence -> Log.d("LOGTAG", "Search string "+charSequence));
Соответственно получается так что если ввести текст, удовлетворяющий всем условиям второго Observable (textChangedEvent) а потом нажать Go - событие в подписчик приходит дважды - сначала по Go а потом по Timeout'ту. А можно как-то сделать так что событие нажатия клавиатуры сбрасывало/подавляло то что отложено (остановленное в .debounce(2, TimeUnit.SECONDS))? Среди более сотни операторов так и не могу подобрать подходящую комбинацию. Ещё пробовал amb но этот оператор один раз делает выбор между из всех Observable тот который первый испустил событие и отбрасывает все остальные, такое поведение не то что нужно.
Знатоки RXJava, подскажите как быть?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.09.2019, 15:01
Ответы с готовыми решениями:

RxJava Observable.from из BroadcastReceiver
Здравствуйте. Недавно начал внедрять rxJava и столкнулся со сложностью: Есть BroadcastReceiver (или любая другая периодически...

Как изменить программу так, чтобы было два потока:соотвественно один родительский, другой дочерний
Как изменить программу так, чтобы было два потока:соотвественно один родительский, другой дочерний, а то у меня получется, что две функции...

Не получается перемножить два вектора, один комплексный другой его комплексно-сопряженный, так чтобы получился вектор с
Не получается скалярно перемножить два вектора, один комплексный другой его комплексно-сопряженный, так чтобы получился вектор с...

6
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
13.09.2019, 16:05 2
Попробуй этот https://rxmarbles.com/#race
0
 Аватар для arvalon
22 / 7 / 2
Регистрация: 26.10.2012
Сообщений: 212
Записей в блоге: 1
13.09.2019, 16:17  [ТС] 3
Цитата Сообщение от ExFau$t Посмотреть сообщение
Попробуй этот https://rxmarbles.com/#race
Хм, не могу найти такой оператор в RXJava, кажется он есть только в RxJS?
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
13.09.2019, 16:26 4
А, ну значит этот: http://reactivex.io/documentat... s/amb.html
Не понял, что тут не подходит.
0
 Аватар для arvalon
22 / 7 / 2
Регистрация: 26.10.2012
Сообщений: 212
Записей в блоге: 1
13.09.2019, 16:34  [ТС] 5
Цитата Сообщение от ExFau$t Посмотреть сообщение
А, ну значит этот: http://reactivex.io/documentat... s/amb.html
Не понял, что тут не подходит.
C amb получается так что на этом операторе один раз на всё время подписки выбирается Observable, первым выпустивший событие. Второй игнорируется всё время. А нужно что бы последующий и ввод текста и клики по Go совместно работали и выпускалось событие прошедшее все фильтры первым.
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
13.09.2019, 16:49 6
Ну случилось событие начала ввода, слушаем кнопку или ждём 2 секунды, дождались чего-то - выполнился поток и всё. Можно хоть 100 раз повторять, что не так?
0
 Аватар для arvalon
22 / 7 / 2
Регистрация: 26.10.2012
Сообщений: 212
Записей в блоге: 1
13.09.2019, 16:53  [ТС] 7
Цитата Сообщение от ExFau$t Посмотреть сообщение
слушаем кнопку или ждём 2 секунды
Вот, вот в этой фразе похоже что вся загвоздка. Описать это в терминах rx-цепочек не удаётся. Если ввести текст и успеть нажать кнопку до истечения 2 секунд - два события приходят в подписчик. А хотелось бы одно, которое запустилось нажатием кнопки.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.09.2019, 16:53
Помогаю со студенческими работами здесь

Как сделать так что я мог умножать не на два числа а на 3,4,5 и так далее?
Вот код: #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main(){ float a,c; char b; skip: ...

Как сделать так,чтобы один круг не закрашивал другой?
См.Скрин. Как сделать так,чтобы они были как бы оба &quot;прозрачными&quot;? Сам скрин

Есть два списка: один [a, b, c], другой [1, 2, 3]. Нужно вывести один список вида [a-1, b-2, c-3]
Помогите решить, пожалуйста. Есть два списка: один , другой . Нужно вывести один список вида

Как в проэкт запихать два срр-файла (один вызывает другой)
Тело ф-ии в одном .срр а Маin в другом .срр как это сделать?? Есть проэкт. в папке Source files два срр-шника. Функция в одном а...

Как правильно подключить два винчестера(один sata, другой ide)?
Здравствуйте. Подскажите, как правильно подключить два винчестера(один sata, другой ide)? На sata хочу установить windows xp, на ide -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Winforstrap или красявый дизайн своими руками на HTML+JS+Winform­s
anomal6 04.03.2025
Сидел тут вечером ковырял проект на MAUI, и как же глупо создаются пакеты MSIX и система обновлений пакета публикации, но не об этом. Бывает нужен современный дизайн программы а писать на MAUI,. . .
Формат данных для симуляции физики, посредством распространённы­­­­­­­х не обученных моделей.
Hrethgir 04.03.2025
Что-то как-то снова потерялось, зато катангенсы закатангесились в одном сообщении. На днях писал, что планирую для работы апгрейдить (на этот раз удачно) девайс для работы (конкретно - здоровья для,. . .
Концепция variadic
CoderHuligan 04.03.2025
Мне не очень нравится (а кому это нравится?) что у нас есть отдельно компилятор, отдельно линковщик, причем со своим собственным командным языком. При этом усложнении надо знать помимо языка. . .
Java Record или Kotlin Data Class: что лучше для неизменяемых данных
Wired 04.03.2025
Java Record и Kotlin Data Class — два мощных инструмента для обуздания неизменяемых структур данных, каждый со своим уникальным подходом к решению этой задачи. История их появления весьма. . .
Создание производительны­­­х API с Java и gRPC
Wired 04.03.2025
В мире микросервисной разработки вопрос производительности часто становится краеугольным камнем. И хотя REST API давно завоевал сердца разработчиков своей простотой и интуитивностью, при высоких. . .
Что нового в JDK 24
Wired 04.03.2025
JDK 24 — это настоящий прорыв в эволюции Java, который кардинально меняет правила игры. В этом релизе разработчики Oracle наконец-то довели до ума множество критически важных улучшений в. . .
Разработка блокчейн с использованием Java: смарт-контракты и dApp
Wired 04.03.2025
Погружаясь в мир блокчейн-разработки на Java, разработчик получает доступ к внушительному арсеналу инструментов. В отличие от Solidity, который "заперт" в экосистеме Ethereum, Java предоставляет. . .
WebAssembly в Kubernetes
stackOverflow 03.03.2025
В современной экосистеме облачных технологий WebAssembly (Wasm) становится все более значимым компонентом, предлагая уникальный подход к выполнению кода в распределенных системах. Эта технология. . .
GitHub Actions или Jenkins: Выбираем CI/CD платформу
stackOverflow 03.03.2025
Непрерывная интеграция и развертывание (CI/ CD) изменили подход к разработке программного обеспечения, превратив его в бесшовный процесс от написания кода до развертывания в продакшн. GitHub Actions и. . .
Автоматизация тестирования Pull Request в Kubernetes: Интеграция с GitHub Actions и GKE
stackOverflow 03.03.2025
Масштабные проекты с использованием Kubernetes требуют надежной системы тестирования изменений перед их внедрением в продакшн-среду. Традиционный подход с ручной проверкой Pull Request не справляется. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru