引起:rx.exceptions.MissingBackpressureException

时间:2015-12-24 04:44:46

标签: android rx-java kotlin

我还有其他问题。这次我在执行此代码时遇到此错误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,但我不知道我做错了什么或如何解决它。

任何人都可以就此提出建议。

1 个答案:

答案 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使用OperatorMergemerge(map(func))):您可以看到,在您的情况下,map的onNexts发送速度比请求的速度快。