Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RxJava异步缓存:处理replay()的正确方法。可观察到的autoConnect()_Java_Rx Java_Observable - Fatal编程技术网

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