RxJava v1.0.13引入了一种新类型的可观察对象:rx.Single。它非常适合请求-响应模型,但是缺乏引入像doOnNext()这样的运算符的标准副作用。因此,很难让多件事情因此而发生。
我的想法是用对同一实例的多个订阅替换doOnNext()。但这可能会导致底层工作多次执行:每次订阅一次。
rx.Single实现示例:
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的实例,它不会多次fetchSomeData(),即使single.subscribe()被多次调用,但缓存并返回相同的结果?
发布于 2015-08-07 20:25:24
您需要RxJava Subject:BehaviorSubject
或AsyncSubject
发布于 2016-09-24 04:10:41
我只是需要类似的行为,并找到了一些解决方案。
您可以将Single
转换为Observable
,应用cache()
,然后再将其转换回Single
。
yourSingle.toObservable().cacheWithInitialCapacity(1).toSingle()
我使用cacheWithInitialCapacity(1)
而不只是cache()
作为优化- Single
永远不会发出多个项目。
提供Transformer
实现也是一个好主意
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)
发布于 2015-09-02 07:06:01
请检查cache()
operator。它应该缓存来自Observable
的发射,并将它们复制到后续的Subscriber
中。
https://stackoverflow.com/questions/31875514
复制相似问题