2017-03-07 4 views
5

私はobservableの結果に対して短命のキャッシュを提供する必要があります。RxJava非同期キャッシュ:replay()を処分する適切な方法です。autoConnect()Observable

オプションを見て、私は次を参照してください。

  1. キャッシュreplay(1).refCount()とデータの準備ができたときに、実際の値をキャッシュします。 キャッシュ取得は実際のデータをチェックし、Observable.justを返すか、 を返します。

  2. キャッシュreplay(1).autoConnect(1)、いつもは

後者はよりまっすぐ進むと思われるが、それはキャッシュを無効にする必要があるときに正しく、観察処分する方法を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

キャッシュは来るようにそれらを放出します - [marble diagram](http://reactivex.io/RxJava/javadoc/rx/Observable.html#cache())を参照してください。しかし、それは直ちに観測可能なソースにサブスクライブし、サブスクライバが0人のときは退会しないので、1人ではないオブザーバブルには適していません。しかし、あなたはガベージコレクションを残すことができます。 –

+0

私は最新の1.x、1.2.7をテストしました。これは私が見ているものです:すぐにアイテムを発光させるようなキャッシュのように見えますが、これはもう問題ではありません。私はサイズのヒントを提供することができますが、まだ上流からの購読を中止することはできませんので、無限のソースにはまったく適していません。それはガベージコレクションが正しく、それは同時または疎の購読をサポートしています、それはかなり私のニーズをカバーしています – user2649908

関連する問題