RX java 运行 2 http命令同步非阻塞

RX java run 2 http command synchronously and non blocking

我想创建一个 observables 将:

  1. 从服务器获取数据
  2. 使用它得到的结果 - 获取更多数据
  3. 用第二个结果调用一些回调。

最终什么都没有返回,但是这一切不应该阻塞当前线程。

这是我得到的:

Observable.just(service1.getres1)  // Returns real object
    .flatMap(result1 -> {
            result2 = service2.getRes2(result1));
            return Observable.just(result2);
    })
    .subscribe(gameMiniProfile -> {
               doLogic();
    });

这段代码有效,但我认为它阻塞了线程,我在其中一个回调中添加了 Thread sleep,并在订阅后打印了一个日志,发现线程被阻塞了。

我该怎么做?

您使用 Observable.just() 构建观察者链的方式意味着它将 运行 在与它订阅的线程相同的线程上。根据文档,您在代码中使用的运算符 None 个 "run on a particular scheduler"。

您可以添加一个 subscribeOn() 运算符以使观察者链 运行 在另一个调度程序上,或者使用 observeOn() 以便观察者将在不同的调度程序上运行。

首先,您需要使用运算符 subscribeOn.

指定 Observable 将在其上运行的 Scheduler

但更重要的是,既然你说你想从服务器获取数据(因此异步更有意义),你应该为你的服务建模,以便它们可以 return Observable.签名应该是这样的:

Observable<YourResltObj1> getres1(); // service1

Observable<YourResltObj2> getRes2(YourResltObj1 result); // service2

所以现在,您可以简单地做:

service1.getres1()
    .subscribeOn(Schedulers.io())
    .flatMap(result -> service2.getRes2(result))
    .observeOn(AndroidSchedulers.mainThread()) // if you want your doLogic() to be executed on the UI thread
    .subscribe(gameMiniProfile -> {
               doLogic();
    });