gpt4 book ai didi

multithreading - RxJava - 如何将观察者设置为阻止

转载 作者:行者123 更新时间:2023-12-01 07:55:37 27 4
gpt4 key购买 nike

我要我的 Observable阻塞直到操作完成,然后继续下一个方法调用等。看看这段代码:

import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.functions.Func1;

Observable observer1 = Observable.just(1, 2, 3)
.observeOn(AndroidSchedulers.mainThread());

Observable observer2 = observer1.map(new Func1<Integer, Integer>() {
@Override
public Integer call(Integer myint) {
//multiples each int by 2
return myint * 2;
}
});

observer2.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(AndroidSchedulers.mainThread());

observer2.subscribe(new Action1<Integer>() {
@Override
public void call(Integer i) {
System.out.println("this is the Integer multiplied by two:" + i);
}
});

System.out.println("I want this statement to come after multiplication completes");

我意识到我可以使用 onComplete回电,但这不是我的意思。我试图弄清楚如何阻止观察者直到它完成然后继续我的其余代码。此时日志如下所示:

I/System.out﹕ I want this statement to come after multiplication completes
I/System.out﹕ this is the Integer multiplied by two:2
I/System.out﹕ this is the Integer multiplied by two:4
I/System.out﹕ this is the Integer multiplied by two:6



还要注意我是如何在 MainThread 上观察和订阅所有内容的,如果我没有指定,这是默认完成的吗?

最佳答案

如果你想阻塞直到 Observable 完成使用 observable.toBlocking().forEach()而不是 subscribe() .

observer2
.toBlocking()
.forEach(new Action1<Integer>() {
@Override
public void call(Integer i) {
System.out.println("this is the Integer multiplied by two:" + i);
}
});

有多个 Blocking Observable Operators除了 forEach() 之外还可以使用以获得想要的效果。例如,如果您只需要发出的第一项,则使用 observable.toBlocking().first()
另请注意,RxJava API 会为您进行的每个调用返回一个新的 Observable。因此,以下行对 observable2 使用的调度程序没有影响。

observer2.observeOn(AndroidSchedulers.mainThread()).subscribeOn(AndroidSchedulers.mainThread());

它确实使用指定的调度程序创建了一个新的 Observable,但由于返回的 Observable 未分配给任何变量,因此将其丢弃。您可以改为执行以下操作。

observer2
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(AndroidSchedulers.mainThread())
.toBlocking()
.forEach(new Action1<Integer>() {
@Override
public void call(Integer i) {
System.out.println("this is the Integer multiplied by two:" + i);
}
});

关于multithreading - RxJava - 如何将观察者设置为阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28081821/

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