2017-03-07 77 views
5

我必須爲observable的結果提供一個短暫的緩存。在選項RxJava異步緩存:正確的方式來處理重播()。autoConnect()Observable

看,我看到以下內容:

  1. 緩存replay(1).refCount()當數據準備好,緩存的實際值。 緩存檢索將檢查實際數據並執行Observable.just或返回 待定可觀察或啓動新的請求。

  2. 緩存replay(1).autoConnect(1)始終返回

後者似乎更直接,但它有一點需要注意,如何正確處置觀察到,當緩存有失效。

有一個簽名:

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

但很難說我怎麼可以跟蹤優秀的訂閱,以及是否處置將是婀娜多姿。

以前會照顧資源的重新分配,但是你必須產生更復雜的邏輯。

回答

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

緩存操作員在序列完成之前不發射。此外,我認爲你有同樣的問題,你必須安全地處理它知道#活動訂閱。 – user2649908

+0

緩存會在它們出現時發出它們 - 請參閱[大理石圖](http://reactivex.io/RxJava/javadoc/rx/Observable.html#cache()),但它會立即訂閱源觀察值,並將如果您有0個訂戶,則不會取消訂閱,所以不適合非1尺寸的Observables。但你*可以*只是讓它被垃圾收集。 –

+0

我測試了最新的1.x,1.2.7,這是我看到的:看起來像緩存開始發射物品,這不再是問題了。我可以提供尺寸提示,仍然不能退訂上游,因此根本不適合無限來源。它可以正確收集垃圾,它支持併發或稀疏訂閱,它幾乎涵蓋了我的需求 – user2649908