基本上,我所追求的是如何创建资源1,2,3,4,处理结果,然后处理4,3,2,1,要求如果有的话创建资源3时出错,我们只需要处理2,1。
作为一个例子,让我们说我们有:
Observable1从文件中读取行并每行进行一次发射。 为了正确处理文件资源,文件应该在开头打开,最后关闭。
Observable2应该接受来自Observable1的发射,并将它们写入另一个文件。为了简单起见,我们只需要在每行的末尾添加一个逗号。 为了正确处理另一个文件资源,我们应该在开头创建新文件,然后在最后刷新并关闭它。
我想它应该看起来像
observable1.flatMap ( line -> { doMagicHere(line+",") } )
.subscribe ( line -> { System.out.println(line) },
ex -> { ex.printStackTrace() }
)
如果在打开file1时发生错误,我们不应该创建file2(也不要处置它) 如果在处理行时发生错误,则应首先处理file2,然后才应处理file1。 (即使在这个特定的例子中它可以以任何方式工作)
我想我可以使用Observable.using()运算符创建Observable1,我们在第一个参数中打开文件,在第二个参数中创建observable,最后在3d参数中配置(关闭)文件。
我不知道如何应用"使用"第二步中的操作员,或者是否是正确的方法。
感谢任何解决方案或指针(最好是在rxjava 2中)
答案 0 :(得分:0)
Observable.using()
有一个良好的开端。但是,第一个可观察的是:
Observable<Observable<String>> observable1;
通过添加此间接,您可以处理第一个资源无法加载的情况。
interface FileWriter {
void write(String line);
}
Observable<FileWriter> makeDestinationFile(String filename);
通过引入FileWriter
抽象,您可以绑定第二个资源。
observable1.flatMap(
lineSource ->
Observable.combineLatest( lineSource,
makeDestinationFile(filename),
( line, writer ) -> writer.write( line + "," ) )
.subscribe();
当observable1
完成时,两个observable都将完成,底层资源将被释放。
答案 1 :(得分:0)
对于后退范围,我使用此代码
Observable.range(0,10)
.map { 10 - it }
.subscribe {
print(it)
//emit 10,9,8,...,2,1
}