Я пытаюсь создать реактивный конвейер, который принимает символы (0-9, *, #), введенные на матричной клавиатуре 4x3 , и отображает их на 4-значном семизначном сегментный дисплей . То есть для каждого нового элемента, который испускается, мне нужно объединить его с предыдущими значениями n = 3.
До сих пор я выставлял PublishSubject<Character> keypresses
в классе контроллера клавиатуры. Этот класс, однако, испускает все нажатия клавиш. То есть, даже если вы нажмете клавишу (например, 1) только на мгновение, будет выдано несколько единиц. Поэтому я использую оператор debounce
, чтобы гарантировать, что на одно нажатие клавиши выдается только один Character
:
KeypadController kbc = new KeypadController();
kbc.keypresses.debounce(250, TimeUnit.MILLISECONDS)
.subscribe(c -> {System.out.println(c);});
Пока все хорошо. На другом конце спектра у меня есть 4-значный класс контроллера семисегментного дисплея. Этот класс предоставляет методы writeDigit(int position, char value)
и clearScreen()
. То есть, если я хочу отобразить число 7654, мне нужно вызвать метод четыре раза:
SevenSegmentController segment = new SevenSegmentController();
segment.writeDigit(3,'7')
segment.writeDigit(2,'6')
segment.writeDigit(1,'5')
segment.writeDigit(0,'4')
Однако мне бы хотелось, чтобы дисплей постоянно обновлялся в виде пользовательских клавиш цифрами. Как показывает следующий сценарий.
user presses 7
|----| segment.writeDigit(0,'7')
| 7|
|----|
user presses 6
|----| segment.writeDigit(1,'7')
| 76| segment.writeDigit(0,'6')
|----|
user presses 5
|----| segment.writeDigit(2,'7')
| 765| segment.writeDigit(1,'6')
|----| segment.writeDigit(0,'5')
user presses 4
|----| segment.writeDigit(3,'7')
|7654| segment.writeDigit(2,'6')
|----| segment.writeDigit(1,'5')
segment.writeDigit(0,'4')
Finally,
|----| Display clears after timeout (1000ms without input)
| | or if user presses 5th key
|----| segment.clearScreen()
Метод ReplaySubject
с его методом createWithTimeAndSize
выглядел многообещающим, поскольку в нем сохраняется не более заданного числа элементов, которые также не старше указанного количества времени. Однако такое поведение проявляется только при подписке, после чего наблюдатели непрерывно получают с этого момента. Существует ли способ для ReplaySubject - или какого-либо другого класса / метода rxjava - непрерывно выводить последние 4 цифры в течение определенного промежутка времени, скажем, 2000 мс.