使用backpreasurebuffer时为什么会出现MissingBackpreasureException?

时间:2016-02-22 10:51:50

标签: android queue rx-java rx-android backpressure

我想在RxJava中实现一个下载一些文件的处理队列。我想下载的文件数量最多可达100个。

所有内容都是使用RxJava 1.1.1在Android上开发的

我目前的实现看起来像这样:

PublishSubject<URL> publishSubject = PublishSubject.create();
_subject = new SerializedSubject<>(publishSubject);

_subscription = _subject
                .subscribeOn(Schedulers.io())
                .observeOn(Schedulers.io())
                .subscribe(_getObserver());  // Observer

_subject.onBackpressureBuffer(10000, new Action0() {
    @Override
    public void call() {
        Log.d(TAG, "onBackpressureBuffer called");
        return;
    }
});

// download a file
_subject.onNext(aValidURL);

_getObserver()返回一个新的观察者对象,该对象在&#34; onNext&#34;方法

然而,我的问题是我很快得到MissingBackpreasureException,我不明白。我尝试实现backpreasurebuffer,但它似乎没有被调用。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

在RxJava中,当您应用运算符时,您将获得一个具有已修改行为的新Observable实例,但原始实例保持不变。在这里,您在onBackpressureBuffer上拨打了_subject,但之后没有使用其结果,否则通话无效。您需要按顺序应用它:

PublishSubject<URL> publishSubject = PublishSubject.create();
_subject = new SerializedSubject<>(publishSubject);

_subscription = _subject
                .onBackpressureBuffer(10000, new Action0() {
                    @Override
                    public void call() {
                        Log.d(TAG, "onBackpressureBuffer called");
                        return;
                    }
                })
                .subscribeOn(Schedulers.io())
                .observeOn(Schedulers.io())
                .subscribe(_getObserver());  // Observer

// download a file
_subject.onNext(aValidURL);