首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RX java运行2 http命令,同步和非阻塞。

RX java运行2 http命令,同步和非阻塞。
EN

Stack Overflow用户
提问于 2017-12-10 15:46:28
回答 2查看 201关注 0票数 0

我想创造一个可以观察到的:

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

最终不会返回任何内容,但所有这些都不应该阻止当前线程。

这就是我得到的:

代码语言:javascript
复制
Observable.just(service1.getres1)  // Returns real object
    .flatMap(result1 -> {
            result2 = service2.getRes2(result1));
            return Observable.just(result2);
    })
    .subscribe(gameMiniProfile -> {
               doLogic();
    });

这段代码可以工作,但我认为它阻塞了线程,我在其中一个回调中添加了线程睡眠,并在订阅之后添加了日志打印,并看到线程被阻塞。

我怎么能这么做?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-10 16:33:51

使用Observable.just()构建观察者链的方式意味着它将运行在与订阅相同的线程上。根据文档,您在代码“运行在特定调度程序上”中使用的操作符中没有一个。

您可以添加一个subscribeOn()操作符,让观察者链在另一个调度程序上运行,或者使用observeOn(),这样观察者就可以在不同的调度器上运行。

票数 1
EN

Stack Overflow用户

发布于 2017-12-10 16:34:15

首先,您需要使用操作符Scheduler指定Observable将在其上运行的subscribeOn

但是更重要的是,因为您说您希望从服务器获取数据(所以异步更有意义),所以您应该对您的服务进行建模,以便它们能够返回Observable。签名应该是这样的:

代码语言:javascript
复制
Observable<YourResltObj1> getres1(); // service1

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

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

代码语言:javascript
复制
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();
    });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47740481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档