2016-09-16 56 views
2

を阻止するに加入し、私は次のことを実現したいと思います:RxJava観測可能

String result = myObservable.toBlocking().first(); 

すなわち、それは通常の関数呼び出しのようです。しかし、あなたがそれを購読する必要があるので、これは決して起こりません。私はそれを行う方法がわかりません。私がそれを購読すれば結果は別のスコープになり、コードは非常に醜いです。なぜなら、私はその結果を通常の観測可能なものと同じように得ることができますから、それをブロッキングオブザーバブルに変える必要はありません。それは実際に動作

答えて

1

あなたが望むよう:ボンネットの下に

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 BehaviourSubjecttoBlocking()です。両方ともObservableObserverなので、どこかで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"); 
+0

興味深い...それが違いを生む作っていますか?それは私のために全スレッドを無期限にブロックします。 – breakline

関連する問題