我还有其他问题。这次我在执行此代码时遇到此错误Caused by: rx.exceptions.MissingBackpressureException
:
class UpdateHelper {
val numberOfFileToUpdate: PublishSubject<Int>
init {
numberOfFileToUpdate = PublishSubject.create()
}
public fun startUpdate(): Observable<Int>{
return getProducts().flatMap { products: ArrayList<Product> ->
numberOfFileToUpdate.onNext(products.size)
return@flatMap saveRows(products)
}
}
private fun getProducts(): Observable<ArrayList<Product>> {
return Observable.create {
var products: ArrayList<Product> = ArrayList()
var i = 0
while (i++ < 100) {
products.add(Product())
}
it.onNext(products)
it.onCompleted()
}
}
private fun saveRows(products: ArrayList<Product>): Observable<Int> {
return Observable.create<Int> {
var totalNumberOfRow = products.size
while (totalNumberOfRow-- > 0){
it.onNext(products.size - totalNumberOfRow)
Thread.sleep(100)
}
it.onCompleted()
}
}
}
代码只是两个进程的测试代码。第一个进程从Web获取Product
列表,然后这些产品将持久存储到应用程序内的本地数据库中。这是主要的想法。
方法getProducts
完成获取数据的工作,在这种情况下,我只创建一个包含100个产品的ArrayList。 saveRows
执行持续工作。
saveRows
方法会发出表示已保存行的Int
juts。我这样做是因为在UI中我有一个报告进度的进度条。
从应用程序的另一个角度,我调用方法startUpdate
,在发出几个项目后,我得到描述异常
at com.techbyflorin.rockapan.helpers.UpdateHelper$saveRows$1.call(UpdateHelper.kt:46)
at com.techbyflorin.rockapan.helpers.UpdateHelper$saveRows$1.call(UpdateHelper.kt:40)
我理解为什么这个例外应该发生https://github.com/ReactiveX/RxJava/wiki/Backpressure
,但我不知道我做错了什么或如何解决它。
任何人都可以就此提出建议。
答案 0 :(得分:4)
问题是您的Observable源的消耗速度快于消费者消耗的速度。保存每个产品需要100毫秒。您可以添加onBackpressureBuffer()。
UpdateHelper().startUpdate()
.onBackpressureBuffer() // Add this
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
Log.d(TAG, "next $it")
}, {
Log.d(TAG, it.message)
}, {
})
此外,您可以尝试删除Thread.sleep(100)
。
flatmap使用OperatorMerge(merge(map(func))
):您可以看到,在您的情况下,map
的onNexts发送速度比请求的速度快。