RxAava中的调度程序api是否与RxAndroid中的AndroidSchedulers.mainThread()同义。 因此,如果我在新线程上安排任务,并且我想在Java主线程上观察它,我该怎么做?
修改的 下面是一个示例RxSubscription,在system.in注释时,当Observable.interval在一个单独的线程上运行时,Main线程被终止。在Android中,我可以说observeOn(AndroidSchedulers.MainThread),此后的任何操作都将在主线程上运行。我在Java中寻找类似的调度程序,因为AndroidSchedulers是RxAndroid的一部分。
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import rx.Observable;
public class Main {
public static void main(String[] args) throws InterruptedException, IOException {
Observable<Long> values = Observable.interval(1000, TimeUnit.MILLISECONDS);
values.subscribe(
v -> System.out.println("Received: " + v),
e -> System.out.println("Error: " + e),
() -> System.out.println("Completed")
);
//System.in.read();
}
}
答案 0 :(得分:5)
回到&#34; main&#34;由于RxJava 1.x没有阻塞调度程序,因此目前无法使用Java线程。
如果你可以升级到RxJava 2.x,我有一个特殊的调度程序可以固定&#34;固定&#34;到当前主题:
compile "com.github.akarnokd:rxjava2-extensions:0.15.1"
<强> BlockingScheduler 强>
这种类型的调度程序在&#34;当前线程&#34;上运行其执行循环,更具体地说,是调用其execute()方法的线程。该方法将阻塞,直到调用shutdown()。这种类型的调度程序允许返回&#34; main&#34;来自其他线程的线程。
public static void main(String[] args) {
BlockingScheduler scheduler = new BlockingScheduler();
scheduler.execute(() -> {
Flowable.range(1, 10)
.subscribeOn(Schedulers.io())
.observeOn(scheduler)
.doAfterTerminate(() -> scheduler.shutdown())
.subscribe(v -> System.out.println(v + " on " + Thread.currentThread()));
});
System.out.println("BlockingScheduler finished");
}
答案 1 :(得分:0)
是的,RxJava有调度程序。要向任何线程发送消息,您需要有一个等待来自其他线程的消息的消息循环。在Android中,这是你的Looper。在Java中,您需要自己完成。然后,您的调度程序将向该线程发送一条消息,并在该消息响应中执行该操作。其机制取决于您实现消息队列的方式,但应该相当简单。