RX java 运行 2 http命令同步非阻塞
RX java run 2 http command synchronously and non blocking
我想创建一个 observables 将:
- 从服务器获取数据
- 使用它得到的结果 - 获取更多数据
- 用第二个结果调用一些回调。
最终什么都没有返回,但是这一切不应该阻塞当前线程。
这是我得到的:
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();
});
我想创建一个 observables 将:
- 从服务器获取数据
- 使用它得到的结果 - 获取更多数据
- 用第二个结果调用一些回调。
最终什么都没有返回,但是这一切不应该阻塞当前线程。
这是我得到的:
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();
});