带过滤器和映射的RxJava rx.exceptions.MissingBackpressureException

时间:2015-12-13 17:05:51

标签: java android reactive-programming rx-java rx-android


我刚刚开始使用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>。我的问题是:

  1. 我该如何过滤这些群组? filter(<List<File>>, Boolean)没有任何意义......
  2. 我如何在我的文件扫描程序中实现可观察的背压处理,以便等到我的管道/运营商/订户有容量?
  3. 使用例如转换项目是一种好习惯吗map()进入XYZ实体并将它们存储在一个单独的列表中,而不是作为活动用户但在运营商中是副作用?
  4. 一些反馈甚至提示会有很多帮助,值得赞赏。

1 个答案:

答案 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()的订单似乎有很大差异!

我的第三个问题是偏离主题但仍然开放。也许有人可以对此发表评论。