【发布时间】:2017-01-08 16:36:24
【问题描述】:
我目前在带有 Kotlin 的 Android 上使用 RxJava,但是我遇到了一个问题,如果不使用 toBlocking() 就无法解决。
我在员工服务中有一个返回 Observable 的方法>:
fun all(): Observable<List<Employee>>
这一切都很好,因为每当员工发生变化时,这个 Observable 都会发出新的员工列表。但是我想从员工那里生成一个 PDF 文件,这显然不需要在每次员工更改时都运行。另外,我想从我的 PDF 生成器方法返回一个 Completable 对象。我想在我的PDF中添加一个标题,然后遍历员工并计算每个员工的工资,这也返回一个Observable,这就是我现在使用toBlocking的地方。我目前的做法是这样的:
private fun generatePdf(outputStream: OutputStream): Completable {
return employeeService.all().map { employees ->
try {
addHeaderToPDF()
for (i in employees) {
val calculated = employeeService.calculateWage(i.id).toBlocking().first()
// Print calculated to PDF....
}
addFooterToPDF()
return @map Completable.complete()
}
catch (e: Exception) {
return @map Completable.error(e)
}
}.first().toCompletable()
有没有什么方法可以使用 RxJava 让这段代码更简洁一些?
提前致谢!
【问题讨论】:
-
没有 for 循环,没有 forEach。基本上一切都必须是可观察的,包括
addHeaderToPDF和addFooterToPDF。calculateWage应该返回一个Single,它要么返回一个值,要么返回错误。 -
calculateWage是一个Observable,因为它会在更改时发出重新计算的员工值。你能告诉我一个如何做到这一点的例子吗?我不能把拼图放在一起。 :( -
~很好,但是改变值将如何帮助您打印不可变的 PDF?在打印每个员工时,您需要一个工资值。〜理解,这是一个可观察的开始。我正在做一些简洁的事情,敬请期待......
标签: java android rx-java kotlin