Queue like Subject in RxJava

前端 未结 3 1331
梦毁少年i
梦毁少年i 2020-12-29 06:06

I\'m looking for a Subject (or something similar) that can:

  1. Could receive items and hold them in a queue or buffer if there are no subscribers
  2. Once we
3条回答
  •  悲&欢浪女
    2020-12-29 06:54

    I had similar problem, my requirements were:

    • Should support replay of values when no Observer subscribed
    • Should allow only one Observer subscribed at a time
    • Should allow another Observer to subscribe when first Observer is disposed

    I've implemented it as RxRelay but the implementation for Subject would be similar:

    public final class CacheRelay extends Relay {
    
        private final ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue<>();
        private final PublishRelay relay = PublishRelay.create();
    
        private CacheRelay() {
        }
    
        public static  CacheRelay create() {
            return new CacheRelay<>();
        }
    
        @Override
        public void accept(T value) {
            if (relay.hasObservers()) {
                relay.accept(value);
            } else {
                queue.add(value);
            }
        }
    
        @Override
        public boolean hasObservers() {
            return relay.hasObservers();
        }
    
        @Override
        protected void subscribeActual(Observer observer) {
            if (hasObservers()) {
                EmptyDisposable.error(new IllegalStateException("Only a single observer at a time allowed."), observer);
            } else {
                for (T element; (element = queue.poll()) != null; ) {
                    observer.onNext(element);
                }
                relay.subscribeActual(observer);
            }
        }
    }
    

    Look at this Gist for more

提交回复
热议问题