我想创造一个可以观察到的:
最终不会返回任何内容,但所有这些都不应该阻止当前线程。
这就是我得到的:
Observable.just(service1.getres1) // Returns real object
.flatMap(result1 -> {
result2 = service2.getRes2(result1));
return Observable.just(result2);
})
.subscribe(gameMiniProfile -> {
doLogic();
});这段代码可以工作,但我认为它阻塞了线程,我在其中一个回调中添加了线程睡眠,并在订阅之后添加了日志打印,并看到线程被阻塞。
我怎么能这么做?
发布于 2017-12-10 16:33:51
使用Observable.just()构建观察者链的方式意味着它将运行在与订阅相同的线程上。根据文档,您在代码“运行在特定调度程序上”中使用的操作符中没有一个。
您可以添加一个subscribeOn()操作符,让观察者链在另一个调度程序上运行,或者使用observeOn(),这样观察者就可以在不同的调度器上运行。
发布于 2017-12-10 16:34:15
首先,您需要使用操作符Scheduler指定Observable将在其上运行的subscribeOn。
但是更重要的是,因为您说您希望从服务器获取数据(所以异步更有意义),所以您应该对您的服务进行建模,以便它们能够返回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();
});https://stackoverflow.com/questions/47740481
复制相似问题