RxJava异步缓存:处理replay()的正确方法.autoConnect()可观察

时间:2017-03-07 21:31:36

标签: java rx-java observable

我必须为observable的结果提供一个短期缓存。

查看选项,我看到以下内容:

  1. 缓存replay(1).refCount(),当数据准备就绪时,缓存实际值。 缓存检索将检查实际数据并执行Observable.just或返回 等待Observable或发起新请求。

  2. 缓存replay(1).autoConnect(1)并始终返回

  3. 后者似乎更直接,但它有一个警告,如何在缓存必须无效时正确处置observable。

    有一个签名:

    public Observable<T> autoConnect(int numberOfSubscribers, Consumer<? super Disposable> connection)

    但很难说我如何跟踪未完成的订阅以及处理是否优雅。

    前者将负责资源释放,但您必须生成更复杂的逻辑。

1 个答案:

答案 0 :(得分:0)

为什么不.cache()

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);}
}