我正在尝试创建一个响应式管道,它会在4x3 matrix keypad上输入字符(0-9,*,#)并将其显示在4-digit, seven-segment display上。这是针对每个发出的新项目,我需要将它与之前的n = 3值组合。
到目前为止,我已经在Keypad控制器类中公开了PublishSubject<Character> keypresses
。但是,此类会发出所有键按下。也就是说,即使您只按一个键(例如1),也会发出多个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位数,比如2000ms。