如何在RxJava中使用Schedulers.trampoline()

ota*_*tal 9 rx-java

由于Schedulers.trampoline()使作业在当前线程上工作,我无法找到案例与Schedulers.trampoline()没有调度程序设置的情况之间的区别.

使用Schedulers.trampoline():

Observable.from(1, 2, 3)
    .observeOn(Schedulers.trampoline())
    .subscribe(System.out::println)
Run Code Online (Sandbox Code Playgroud)

不使用调度程序:

Observable.from(1, 2, 3)
    .subscribe(System.out::println)
Run Code Online (Sandbox Code Playgroud)

我认为上面的代码行为相同.我真的很想知道为什么Schedulers.trampoline()存在于RxJava的API中.

在什么情况下,我应该使用Schedulers.trampoline()

Han*_*rst 10

您在observeOn/subscribeOn中使用调度程序不会获得任何好处.您可以使用调度程序中的Worker来安排下班后的工作.

请看一下这个例子.我正在使用RxJava2-RC5

@Test
public void trampoline() throws Exception {
        Scheduler scheduler = Schedulers.trampoline();
        Scheduler.Worker worker = scheduler.createWorker();

        Runnable r1 = () -> {
            System.out.println("Start: r1");
            System.out.println("End: r1");
        };

        Runnable r2 = () -> {
            System.out.println("Start: r2");
            worker.schedule(r1);
            System.out.println("End: r2");
        };

        worker.schedule(r2);
}
Run Code Online (Sandbox Code Playgroud)

输出:

开始:r2结束:r2开始:r1结束:r1

如果你以递归的方式安排工作,蹦床工作人员会派上用场,因为你不会得到和StackOverFlow.

该示例从introtorx重新描述为RxJava(http://www.introtorx.com/content/v1.0.10621.0/15_SchedulingAndThreading.html)