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

Ris*_*kla 3 android rx-java rx-android

RxAava中是否有与RxAndroid中的AndroidSchedulers.mainThread()同义的RxJava中的Scheduler api.因此,如果我在新线程上安排任务,并且我想在Java主线程上观察它,我该怎么做?

编辑 下面是一个示例RxSubscription,在system.in注释时,主线程被杀死,而Observable.interval在一个单独的线程上运行.在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();
}
}
Run Code Online (Sandbox Code Playgroud)

aka*_*okd 5

由于RxJava 1.x没有阻塞调度程序,因此目前无法返回"主"Java线程.

如果你可以升级到RxJava 2.x,我有一个特殊的调度程序,可以"固定"到当前线程:

compile "com.github.akarnokd:rxjava2-extensions:0.15.1"
Run Code Online (Sandbox Code Playgroud)

BlockingScheduler

这种类型的调度程序在"当前线程"上运行其执行循环,更具体地说,是调用其execute()方法的线程.该方法将阻塞,直到调用shutdown().这种类型的调度程序允许从其他线程返回"主"线程.

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");
}
Run Code Online (Sandbox Code Playgroud)