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

RxJava rx.exceptions.MissingBackpressureException带过滤器和映射,java,android,reactive-programming,rx-java,rx-android,Java,Android,Reactive Programming,Rx Java,Rx Android,我刚开始玩RxJava/RxAndroid,在理解如何正确处理背压时遇到了一些问题 我有一个文件扫描器,可以扫描目录并发出文件。这些文件应尽可能快地处理,并且不会跳过任何文件 所以管道看起来像这样: Observable->Filter{检查文件是否为.xyz}类型 不幸的是,我得到了rx.exceptions.MissingBackpressureException错误。所以我读了关于背压的书,如果我理解正确的话,无损耗选项只是缓冲区和窗口 我尝试了onBackpressureBuffer()


我刚开始玩RxJava/RxAndroid,在理解如何正确处理背压时遇到了一些问题

我有一个文件扫描器,可以扫描目录并发出文件。这些文件应尽可能快地处理,并且不会跳过任何文件

所以管道看起来像这样:
Observable->Filter{检查文件是否为.xyz}类型

不幸的是,我得到了rx.exceptions.MissingBackpressureException错误。所以我读了关于背压的书,如果我理解正确的话,无损耗选项只是缓冲区和窗口

我尝试了
onBackpressureBuffer()、buffer()和window()
。虽然所有的
onBackpressureX()
命令似乎都没有效果,但buffer()将项目分组到
列表中。我的问题是:

  • 我应该如何筛选这些组<代码>过滤器(,布尔)
  • 没有意义
  • 我如何在FileScaner中实现可观察的背压处理,使其等待管道/操作员/订阅者具有容量
  • 将具有例如
    map()
    的项目转换为XYZ实体,并将其存储在单独的列表中,而不作为活动订户,但作为操作员的副作用,这是否是一种良好的做法

  • 一些反馈,甚至是提示都会很有帮助,我们会很感激的

    我想我找到了解决问题的方法: 此代码不起作用:

    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 task=scanner.getProcessDirectoryStask(挂载点);
    订阅_订阅=任务
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .onBackpressureBuffer(10000)
    .filter(新函数1(){
    @凌驾
    公共布尔调用(文件){
    返回文件.getAbsolutePath().endsWith(“xyz”);
    }
    })
    .缓冲器(100)
    .subscribe(new Observer(){/*无论您想做什么*/}
    
    但是,此代码正在运行:

    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*/ }
    
    Observable task=scanner.getProcessDirectoryStask(挂载点);
    订阅_订阅=任务
    .onBackpressureBuffer(10000)
    .filter(新函数1(){
    @凌驾
    公共布尔调用(文件){
    返回文件.getAbsolutePath().endsWith(“xyz”);
    }
    })
    .缓冲器(100)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Observer(){/*无论您想做什么*/}
    
    因此,
    subscribeOn()
    observeOn()
    的顺序似乎产生了巨大的差异


    我的第三个问题有点离题,但仍然悬而未决。也许有人可以对此发表评论。

    尝试使用
    onBackPressureDrop()
    谢谢你的建议。onBackPressureX()命令由于顺序(?)而无法工作-请参阅我的答案。此外,一个要求是操作必须是无损的。是的,Schedulers.io()创建另一个线程以处理您对与主线程不同的线程中的文件的请求,这样您就无法与子描述中的视图交互。AndroidSchedulers.MainThread创建一个订阅服务器以在主线程中执行。您必须在敏感操作(如
    observeOn
    )之前放置
    onbackpressurexx
    。但是如何操作de>GetProcessDirectorySTASKimplemented?标准源应支持背压。它是使用Observable.create()和OnSubscribe中长时间运行的文件扫描操作创建的。