首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RxJava:通过` `debouncing()`保护已有接口方法不被用户过度异步调用

RxJava:通过` `debouncing()`保护已有接口方法不被用户过度异步调用
EN

Stack Overflow用户
提问于 2020-11-21 08:45:39
回答 1查看 36关注 0票数 0

假设我有一个实例单例类,它有一个非常流行的方法paint()

代码语言:javascript
复制
public MyClass {
    public void paint() {
        // repaint the screen
    };
}

来自各地的代码在未指定的时间异步调用此paint()方法。例如,有一个计时器周期性地调用该方法,每次用户在应用程序中单击鼠标按钮时,它都会被调用,等等。我想将用户代码对paint()的直接调用转换为可以生成我可以debounce()Observable的东西。类似于:

代码语言:javascript
复制
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() {...}
}

我无法理解这个设计。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-21 22:24:50

PublishRelay是实现所需功能的一个很好的候选者。Relay既是观察者又是提供者,因此您可以通过accept()方法监听和推送值。方法hide()对使用者隐藏了中继实现,他只看到普通的Observable

代码语言:javascript
复制
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);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64938709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档