我刚刚开始使用RxJava / RxAndroid,并且有一些问题需要了解如何正确处理背压。
我有一个文件扫描程序observable,可扫描目录并发出文件。这些文件应该尽快处理,不要跳过任何文件。
所以管道看起来像这样:
Observable<File> -> Filter<File, Boolean> {check if file is of type .xyz}
不幸的是,我收到 rx.exceptions.MissingBackpressureException 错误。所以我读到了背压,如果我理解正确的话,损失较少的选项只有缓冲区和窗口。
我试过了onBackpressureBuffer(), buffer() and window()
。虽然所有onBackpressureX()
命令似乎都没有效果,但buffer()将项目分组为List<File>
。我的问题是:
filter(<List<File>>, Boolean)
没有任何意义...... map()
进入XYZ实体并将它们存储在一个单独的列表中,而不是作为活动用户但在运营商中是副作用?一些反馈甚至提示会有很多帮助,值得赞赏。
答案 0 :(得分:3)
我想我找到了问题的解决方案: 此代码无效:
Observable<File> task = scanner.getProcessDirectoryTask(mountPoint);
Subscription _subscription = task
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.onBackpressureBuffer(10000)
.filter(new Func1<File, Boolean>() {
@Override
public Boolean call(File file) {
return file.getAbsolutePath().endsWith("xyz");
}
})
.buffer(100)
.subscribe(new Observer<List<File>>() { /*whatever you want to do*/ }
但是,此代码 正在运作:
Observable<File> task = scanner.getProcessDirectoryTask(mountPoint);
Subscription _subscription = task
.onBackpressureBuffer(10000)
.filter(new Func1<File, Boolean>() {
@Override
public Boolean call(File file) {
return file.getAbsolutePath().endsWith("xyz");
}
})
.buffer(100)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<File>>() { /*whatever you want to do*/ }
因此,subscribeOn()
和observeOn()
的订单似乎有很大差异!
我的第三个问题是偏离主题但仍然开放。也许有人可以对此发表评论。