【问题标题】:RXJava - hot observables - safe cpu resourcesRXJava - hot observables - 安全的 CPU 资源
【发布时间】:2017-01-26 22:31:34
【问题描述】:

这是一个简单的可观察示例:

observable
            .filter(...)
            .buffer(50, TimeUnit.MILLISECONDS)
            .doOnNext(/* this is executed all the time... */)
            .filter(data -> data.size() > 0)
            .doOnNext(/* this is not executed because of the filter above... */)
            .flatMap(data -> Observable.from(data).distinctUntilChanged())
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe();

问题/疑问

我从 buffer(...) 函数得到的 observable 是一个又一个结果,大部分是空的。

用这样的 observables 过滤是处理这个问题的正确方法吗?同时拥有大量此类订阅是否会降低成本?还是应该以不同的方式处理?

【问题讨论】:

    标签: rx-java


    【解决方案1】:

    一般来说,是的,过滤掉下游不需要的东西。

    同时拥有大量此类订阅是否会降低成本?

    技术上:是的。更多的计时器,计算线程上更多的活动序列。但是,序列的开销可能远小于您执行的业务逻辑。

    为了节省一些开销,我会使用flatMapIterable

    observable
        .filter(...)
        .buffer(50, TimeUnit.MILLISECONDS)
        .doOnNext(/* this is executed all the time... */)
        .filter(data -> data.size() > 0)
        .doOnNext(/* this is not executed because of the filter above... */)
        .flatMapIterable(data -> data)               // <-----------------------------
        .distinctUntilChanged()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe();
    

    【讨论】:

    • 谢谢,这就是我想知道的。我现在必须检查为什么此设置不再需要 distinctUntilChanged 的嵌套调用,它的工作方式与我的示例相同...
    • 那里的数据不是Observable,而是List,Java 中没有distinctUntilChanged
    • 我已经明白了,先想错了……谢谢
    猜你喜欢
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多