首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何创建rx.Single的缓存/热版?

如何创建rx.Single的缓存/热版?
EN

Stack Overflow用户
提问于 2015-08-07 18:26:29
回答 5查看 4.5K关注 0票数 20

RxJava v1.0.13引入了一种新类型的可观察对象:rx.Single。它非常适合请求-响应模型,但是缺乏引入像doOnNext()这样的运算符的标准副作用。因此,很难让多件事情因此而发生。

我的想法是用对同一实例的多个订阅替换doOnNext()。但这可能会导致底层工作多次执行:每次订阅一次。

rx.Single实现示例:

代码语言:javascript
复制
private class WorkerSubscribe<SomeData>() : Single.OnSubscribe<SomeData> {
    override fun call(sub: SingleSubscriber<in SomeData>) {
        try {
            val result = fetchSomeData()
            sub.onSuccess(result)
        } catch(t: Throwable) {
            sub.onError(t)
        }
    }
}

val single = Single.create<SomeData>(WorkerSubscribe())

用法:

代码语言:javascript
复制
single.subscribe({}, {})
single.subscribe({}, {})   // Data is fetched for the second time

有没有可能创建一个Single的实例,它不会多次fetchSomeData(),即使single.subscribe()被多次调用,但缓存并返回相同的结果?

EN

回答 5

Stack Overflow用户

发布于 2015-08-07 20:25:24

您需要RxJava SubjectBehaviorSubjectAsyncSubject

票数 2
EN

Stack Overflow用户

发布于 2016-09-24 04:10:41

我只是需要类似的行为,并找到了一些解决方案。

您可以将Single转换为Observable,应用cache(),然后再将其转换回Single

代码语言:javascript
复制
yourSingle.toObservable().cacheWithInitialCapacity(1).toSingle()

我使用cacheWithInitialCapacity(1)而不只是cache()作为优化- Single永远不会发出多个项目。

提供Transformer实现也是一个好主意

代码语言:javascript
复制
public class SingleUtils {

    public static <T> Single.Transformer<T, T> cached() {
        return single -> single.toObservable()
            .cacheWithInitialCapacity(1)
            .toSingle();
    }
}

因此您可以在任何地方使用缓存,只要调用

代码语言:javascript
复制
yourSingle.compose(SingleUtils.cached())

编辑:从rxJava 1.2.2开始添加的 (https://github.com/ReactiveX/RxJava/releases/tag/v1.2.2)

完全按照这种方式实现(https://github.com/ReactiveX/RxJava/pull/4757)

票数 2
EN

Stack Overflow用户

发布于 2015-09-02 07:06:01

请检查cache() operator。它应该缓存来自Observable的发射,并将它们复制到后续的Subscriber中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31875514

复制
相关文章

相似问题

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