package com.arcao.trackables.internal.rx; import rx.Observable; import rx.Subscriber; public class OnSubscribePublisher<T> implements Observable.OnSubscribe<T> { private boolean complete = false; private T result; private Throwable resultException; @Override public synchronized void call(Subscriber<? super T> subscriber) { if (subscriber.isUnsubscribed()) { return; } try { while (!complete) { wait(); } } catch (Exception e) { resultException = e; } if (resultException != null) { if (!subscriber.isUnsubscribed()) { subscriber.onError(resultException); } } if (result != null) { subscriber.onNext(result); } subscriber.onCompleted(); } public synchronized void publish(T result) { complete = true; this.result = result; notifyAll(); } public synchronized void publishException(Throwable t) { complete = true; resultException = t; notifyAll(); } }