RxJava异步缓存:处理replay()的正确方法。可观察到的autoConnect()
我必须为可观察到的结果提供一个短期缓存 查看选项,我看到以下内容:RxJava异步缓存:处理replay()的正确方法。可观察到的autoConnect(),java,rx-java,observable,Java,Rx Java,Observable,我必须为可观察到的结果提供一个短期缓存 查看选项,我看到以下内容: 缓存replay(1).refCount()数据准备好后,缓存实际值。 缓存检索将检查实际数据并进行可观察。只需或返回即可 挂起的可观察或启动新请求 缓存replay(1)。自动连接(1)并始终返回 后者看起来更直截了当,但它有一个警告,即当缓存必须失效时,如何正确地处理可观察的 有一个签名: 公共可观察自动连接(int numberOfSubscribers,Consumer为什么不.cache() 公共类CachedObse
replay(1).refCount()
数据准备好后,缓存实际值。
缓存检索将检查实际数据并进行可观察。只需或返回即可
挂起的可观察或启动新请求
replay(1)。自动连接(1)
并始终返回公共可观察自动连接(int numberOfSubscribers,Consumer为什么不.cache()
公共类CachedObservable{
私人职能实际;
私有CachedObservable(函数实际值){this.actual=actual;}
private final Map cacheMap=新的ConcurrentHashMap();
公共可观测get(K键){
返回cacheMap.computeIfAbsent(key,k->this.actual.call(k.cache());
}
public void invalidate(K key){cacheMap.remove(key);}
}
cache操作符在序列完成之前不会发出。另外,我认为您也有同样的问题,您必须在知道活动订阅的情况下安全地处理它。缓存会在它们出现时发出它们-请参阅,但它会立即订阅可观察的源,并且在您有0个订阅时不会取消订阅,因此不适合非订阅-1个大小的可观察对象。但您可以让它进行垃圾收集。我测试了最新的1.x,1.2.7,这就是我看到的:看起来缓存立即开始发射项目,这不再是问题。我可以提供大小提示,仍然无法从上游取消订阅,所以根本不适合无限源。它正确地进行垃圾收集,确实如此支持并发或稀疏订阅,基本满足了我的需求
public class CachedObservable<K,V> {
private Function<K, Observable<V>> actual;
private CachedObservable(Function<K, Observable<V>> actual){this.actual=actual;}
private final Map<K, Observable<V>> cacheMap = new ConcurrentHashMap<>();
public Observable<V> get(K key) {
return cacheMap.computeIfAbsent(key, k -> this.actual.call(k).cache());
}
public void invalidate(K key){cacheMap.remove(key);}
}