RxJava中AndroidSchedulers.mainThread()的替代方法是什么?

时间:2017-02-09 19:41:10

标签: android rx-java rx-android

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

2 个答案:

答案 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中,您需要自己完成。然后,您的调度程序将向该线程发送一条消息,并在该消息响应中执行该操作。其机制取决于您实现消息队列的方式,但应该相当简单。