gpt4 book ai didi

rx-java - RxJava订阅可观察的阻止

转载 作者:行者123 更新时间:2023-12-04 11:48:54 25 4
gpt4 key购买 nike

我想要实现以下目标:

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

即就像常规函数调用一样。但是,这永远不会发生,因为您需要订阅它,而我不知道该怎么做。如果我订阅它,结果将在另一个范围内,并且代码非常丑陋,因为无论如何我只能像常规可观察到的那样得到结果,因此将其变成阻塞可观察的是没有意义的。

最佳答案

它实际上可以根据需要工作:

    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();
}

更新:如果使用 BehaviourSubjecttoBlocking()没有任何意义。考虑到它既是 Observable又是 Observer,因此在某个地方应调用 myObservable.onNext("value")。如果您通过调用 toBlocking()来阻塞线程,除非在调用 myObservable的其他线程中可以使用 onNext(),否则您将被阻塞。

例如,这是`BehaviourSubject的常规用法:
  // 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");

关于rx-java - RxJava订阅可观察的阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39523114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com