【问题标题】:Object from Observable<T> with subscribe() does not print valuesObservable<T> 中带有 subscribe() 的对象不打印值
【发布时间】:2019-10-25 02:18:35
【问题描述】:

我已经尝试了解 rxJava Observable 超过一天了,但我就是不知道我的案例需要什么。我想是因为我没有创建一个 Observable,而只是从 API 调用中返回一个,我需要 Observable 类型的类,所以我可以使用该类的对象属性。

这是我的代码,但是当我运行打印语句时会完全跳过。如何使用封装在 Observer 中的对象属性?

// Define woman friend by creating their own large person group person.
// Returns an Observable<Person>.
rx.Observable<Person> personW = client.largePersonGroupPersons()
    .createAsync(largePersonGroupId, new CreateLargePersonGroupPersonsOptionalParameter().withName("Woman"));
System.out.println("Creating Large Person Group Person called "); 
personW.subscribe(response -> System.out.print(response.name()));

【问题讨论】:

  • 如果调用真的是异步的,你需要一种方法来等待print被调用。例如,在 main 方法中休眠。也不要忽略 onError 回调,因为您实际上可能会收到错误而不是响应。
  • 我还在调试中查找了该方法,它实际上返回了一个 Observable.OnSubscribe 接口,它只有一个函数 Call()。那会有什么不同吗?另外,我在 try/catch 中确实有更大的方法,它和 onError() 一样好吗?
  • 哪种方法? try-catch 也不适用于异步序列。
  • 原来我可以通过电子邮件发送 SDK 的 PM,他建议使用 .toBlocking().single(),效果非常好。我猜这是一个异步功能,该方法没有及时完成打印语句。

标签: java observable rx-java2


【解决方案1】:

如果您从 main() 函数调用此代码,您将看不到日志,我认为此函数 createAsync(..) 确实在后台线程中工作,因此要返回您拥有的主线程两个选项。

干净的是使用ObserveOn() 所以代码会是这样的

    rx.Observable<Person> personW = client.largePersonGroupPersons()
    .createAsync(largePersonGroupId, new CreateLargePersonGroupPersonsOptionalParameter().withName("Woman"))
.observeOn(mainthread())//get result in the main thread
        .subscribe(result -> {
            System.out.println("Creating Large Person Group Person called "); 
    })

这个mainthread() 应该返回一个调度程序,这由你来决定,在Android 中我们通过observeOn(AndroidSchedulers.mainThread()) 得到这个

第二个选项是你提到的blockingGet(),但这会冻结线程

【讨论】:

  • 感谢 Mohamed,我确实听说使用 blocking() 不是最好的解决方案。但除非我得到不好的结果,否则我会暂时使用它。不过感谢这个替代方案!它看起来又漂亮又短。
  • 不客气@Azurespot 如果你能接受我的回答,如果它适合你,我将不胜感激
  • @Mohammed,我最终没有使用您的解决方案,但也许其他人会使用!
猜你喜欢
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 2014-05-01
  • 1970-01-01
  • 2021-12-26
相关资源
最近更新 更多