2017-03-07 40 views
5

Tôi phải cung cấp bộ nhớ cache ngắn để có kết quả quan sát được.Bộ đệm không đồng bộ RxJava: cách thích hợp để vứt bỏ replay(). AutoConnect() Quan sát

Nhìn vào các tùy chọn và tôi thấy như sau:

  1. bộ nhớ cache replay(1).refCount() và khi dữ liệu đã sẵn sàng, bộ nhớ cache giá trị thực tế. Truy xuất bộ nhớ cache sẽ kiểm tra dữ liệu thực tế và thực hiện Observable.just hoặc trả về đang chờ xử lý hoặc có thể bắt đầu yêu cầu mới.

  2. bộ nhớ cache replay(1).autoConnect(1) và luôn luôn trả rằng

sau có vẻ thẳng về phía trước, nhưng nó có một ngoại, làm thế nào để xử lý một cách chính xác quan sát khi bộ nhớ cache đã hết hiệu lực.

Có một chữ ký:

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

nhưng khó có thể nói thế nào tôi có thể theo dõi đăng ký lưu hành và có hoặc không xử lý sẽ duyên dáng.

trước đây sẽ xử lý việc phân bổ tài nguyên, nhưng bạn phải tạo ra logic phức tạp hơn.

Trả lời

0

Tại sao không .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

toán tử bộ nhớ cache không phát ra cho đến khi trình tự hoàn tất. Ngoài ra tôi nghĩ rằng bạn có cùng một vấn đề, bạn phải an toàn vứt bỏ nó biết biết số đăng ký hoạt động. – user2649908

+0

Bộ nhớ cache phát ra chúng khi chúng đến - xem [sơ đồ đá cẩm thạch] (http://reactivex.io/RxJava/javadoc/rx/Observable.html#cache()), nhưng nó sẽ đăng ký nguồn có thể quan sát ngay lập tức và sẽ không hủy đăng ký khi bạn có 0 người đăng ký, vì vậy không phù hợp với Đài quan sát không phải 1 người. Nhưng bạn * có thể * chỉ để nó thu gom rác. –

+0

Tôi đã thử nghiệm mới nhất 1.x, 1.2.7, đây là những gì tôi thấy: trông giống như bộ nhớ cache bắt đầu phát ra các mục ngay lập tức, đây không phải là vấn đề nữa. Tôi có thể cung cấp gợi ý kích thước, vẫn không thể hủy đăng ký từ thượng lưu, vì vậy không phù hợp ở tất cả cho nguồn vô hạn. Nó thu thập rác một cách chính xác, nó hỗ trợ đăng ký đồng thời hoặc thưa thớt, nó khá nhiều bao gồm nhu cầu của tôi – user2649908

Các vấn đề liên quan