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()将项目分组到列表中。我的问题是:
我应该如何筛选这些组<代码>过滤器(,布尔)
没有意义
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
。但是