假设我有一个实例单例类,它有一个非常流行的方法paint()
public MyClass {
public void paint() {
// repaint the screen
};
}来自各地的代码在未指定的时间异步调用此paint()方法。例如,有一个计时器周期性地调用该方法,每次用户在应用程序中单击鼠标按钮时,它都会被调用,等等。我想将用户代码对paint()的直接调用转换为可以生成我可以debounce()的Observable的东西。类似于:
public MyClass {
Observable<PaintRequest> obs;
private init() {
obs = (???).debounce(N ms).subscribe(e -> {
actuallyPaint();
});
}
public void paint() {
// push an event into an Observable somehow?
}
private void actuallyPaint() {...}
}我无法理解这个设计。
发布于 2020-11-21 22:24:50
PublishRelay是实现所需功能的一个很好的候选者。Relay既是观察者又是提供者,因此您可以通过accept()方法监听和推送值。方法hide()对使用者隐藏了中继实现,他只看到普通的Observable。
class MyClass {
private final PublishRelay<Integer> paintedRelay = PublishRelay.create();
public void paint() {
// paint to canvas
// notify observers
paintedRelay.accept(0);
}
public Observable<Integer> getPaintedNotifier() {
return paintedRelay.hide();
}
}
public class SO64938709Test {
@Test
public void whenPaintedThenNotified() {
MyClass tested = new MyClass();
TestObserver<Integer> testObserver = tested.getPaintedNotifier().test();
tested.paint();
testObserver.assertValueCount(1);
}
}https://stackoverflow.com/questions/64938709
复制相似问题