RxJava:通过 `debouncing()` 保护现有的 API 方法免受用户过多的异步调用
RxJava: protect an existing API method from excessive async calls by users by `debouncing()`
假设我有一个实例单例 class,它使用了一种非常流行的方法 paint()
:
public MyClass {
public void paint() {
// repaint the screen
};
}
来自各地的代码在未指定的时间异步调用此 paint()
方法。例如。有一个计时器会定期调用该方法,每次用户在应用程序中单击鼠标按钮时都会调用它,等等。
我想将用户代码对 paint()
的这种直接调用转换为生成 Observable
我可以 debounce()
的东西。类似于:
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() {...}
}
无法理解设计。
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);
}
}
假设我有一个实例单例 class,它使用了一种非常流行的方法 paint()
:
public MyClass {
public void paint() {
// repaint the screen
};
}
来自各地的代码在未指定的时间异步调用此 paint()
方法。例如。有一个计时器会定期调用该方法,每次用户在应用程序中单击鼠标按钮时都会调用它,等等。
我想将用户代码对 paint()
的这种直接调用转换为生成 Observable
我可以 debounce()
的东西。类似于:
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() {...}
}
无法理解设计。
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);
}
}