I\'m looking for a Subject (or something similar) that can:
I had similar problem, my requirements were:
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 super T> 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