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

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

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

Студворк — интернет-сервис помощи студентам
Доброго для.
Есть задача. Имеем 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
Попробуй этот https://rxmarbles.com/#race
0
 Аватар для arvalon
22 / 7 / 2
Регистрация: 26.10.2012
Сообщений: 212
Записей в блоге: 1
13.09.2019, 16:17  [ТС]
Цитата Сообщение от ExFau$t Посмотреть сообщение
Попробуй этот https://rxmarbles.com/#race
Хм, не могу найти такой оператор в RXJava, кажется он есть только в RxJS?
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
13.09.2019, 16:26
А, ну значит этот: http://reactivex.io/documentat... s/amb.html
Не понял, что тут не подходит.
0
 Аватар для arvalon
22 / 7 / 2
Регистрация: 26.10.2012
Сообщений: 212
Записей в блоге: 1
13.09.2019, 16:34  [ТС]
Цитата Сообщение от 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
Ну случилось событие начала ввода, слушаем кнопку или ждём 2 секунды, дождались чего-то - выполнился поток и всё. Можно хоть 100 раз повторять, что не так?
0
 Аватар для arvalon
22 / 7 / 2
Регистрация: 26.10.2012
Сообщений: 212
Записей в блоге: 1
13.09.2019, 16:53  [ТС]
Цитата Сообщение от 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
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru