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);
    }
}