あなたが望むよう:ボンネットの下に
Observable<String> myObservable = Observable.just("firstValue", "secondValue");
String result = myObservable.toBlocking().first();
System.out.println(result); // ---> "firstValue"
、あなたのサブスクリプションBlockingObservable.first()
をん呼び出す:
private T blockForSingle(final Observable<? extends T> observable) {
final AtomicReference<T> returnItem = new AtomicReference<T>();
final AtomicReference<Throwable> returnException = new AtomicReference<Throwable>();
final CountDownLatch latch = new CountDownLatch(1);
@SuppressWarnings("unchecked")
Subscription subscription = ((Observable<T>)observable).subscribe(new Subscriber<T>() {
@Override
public void onCompleted() {
latch.countDown();
}
@Override
public void onError(final Throwable e) {
returnException.set(e);
latch.countDown();
}
@Override
public void onNext(final T item) {
returnItem.set(item);
}
});
BlockingUtils.awaitForComplete(latch, subscription);
if (returnException.get() != null) {
Exceptions.propagate(returnException.get());
}
return returnItem.get();
}
UPDATE:任意の意味をなさない場合に使用しますa BehaviourSubject
とtoBlocking()
です。両方ともObservable
とObserver
なので、どこかでmyObservable.onNext("value")
を呼び出す必要があります。 toBlocking()
を呼び出してスレッドをブロックすると、他のスレッドでmyObservable
が利用可能でない限り、onNext()
が呼び出されるとブロックされます。例えば
、これは `BehaviourSubjectの通常の使用である:私はこれが実際にBehaviorSubjectであることを忘れ、
// observer will receive the "one", "two" and "three" events, but not "zero"
BehaviorSubject<Object> subject = BehaviorSubject.create("default");
subject.onNext("zero");
subject.onNext("one");
subject.subscribe(observer);
subject.onNext("two");
subject.onNext("three");
興味深い...それが違いを生む作っていますか?それは私のために全スレッドを無期限にブロックします。 – breakline