当前位置: 首页 > 知识库问答 >
问题:

如何创建rx的缓存/热版本。单身?

宋耀
2023-03-14

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

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

例如rx。单一实施:

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())

用法:

single.subscribe({}, {})
single.subscribe({}, {})   // Data is fetched for the second time

是否可以创建Single的实例,即使它是Single,也不会多次获取SomeData()。subscribe()被多次调用,但是缓存并返回相同的结果吗?

共有3个答案

柯昆
2023-03-14

请检查cache()操作符。它应该缓存可观测的的发射,并将其复制到后续的订户s。

拓拔野
2023-03-14

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

您可以将Single转换为Observableapplycache(),然后将其转换回Single

yourSingle.toObservable().cacheWithInitialCapacity(1).toSingle()

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

它也是好主意提供变压器实现

public class SingleUtils {

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

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

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)

梁福
2023-03-14

您需要RxJava主题:BehaviorSubjectAsyncSubject

 类似资料:
  • 问题内容: 我的代码中有自定义颜色。我多次使用它们,我只希望分配一次。 如果我们看一下UIColor标头,我们可以看到以下内容: 我创建了一个UIColor,就像这样: 从那里,我既可以使用变量也可以使用函数来轻松使用我的颜色。 可悲的是,我对此并不完全满意。确实,每次我想使用这些颜色时,都会进行新的UIColor分配。 我尝试过的 苹果设法使它们的颜色明显被缓存。我也想这样做。我已经尝试了几件事

  • 操作步骤: ①在"图层管理"模块,选择一个带有数据的标注图层,点击"样式设置"。 ②在样式设置中选择"热力图"样式(可以进行渲染半径、配色方案、权重设置、时间序列、开启图例设置),指定显示主题及风格后,应用即可。 提示: 1)渲染半径:生成热力缓冲区范围的大小,半径越大,覆盖的范围越大。最小值为1,最大值为20。 2)配色方案:显示风格,目前支持四种,暂不支持自定义。 3)权重设置:默认为无,按照

  • 我有一个使用Spring缓存注释的Spring Boot应用程序。现在我想迁移到JSR-107(JCache)注释。 这是我的方法: 我希望我的新方法是这样的: 计算器输入类: @CacheKey注释指示spring将整个CalculatorInput对象存储为Key。我只想使用CalculatorInput类的属性id作为键。 我如何创建一个缓存键(就像我在Spring缓存注释中所做的那样),但

  • 我在使用SSL时遇到了困难,因为我得到了以下与我的密钥存储相关的错误(使用keytool per:http://developer.android.com/tools/publishing/app-signing.html自创建和自签名): 08-14 20:55:23.044:W/System.err(5430):java.io.ioException:密钥存储的版本错误。08-14 20:55

  • 问题内容: 我有一个JpaRepository在Spring MVC应用程序中持久保存新创建的实体。这个实体看起来像这样(非常简化): 和版本实体: 我创建一个这样的翻译对象 其中11是从一开始就已经存在于数据库中的版本。请注意,我没有为ClientVersionDTO 设置和的值。 然后,我有一个持久化新对象的服务(我使用库将DTO转换为实体) 请注意我的评论“ t2.getVersion()返

  • 问题 在创建一个类的对象时,如果之前使用同样参数创建过这个对象, 你想返回它的缓存引用。 解决方案 这种通常是因为你希望相同参数创建的对象时单例的。 在很多库中都有实际的例子,比如 logging 模块,使用相同的名称创建的 logger 实例永远只有一个。例如: >>> import logging >>> a = logging.getLogger('foo') >>> b = logging