rxjava2:多次收到同一事件

时间:2018-07-23 03:47:57

标签: android rx-java2

我有一个DownloadTransformer可以下载文件。我确定下载完文件后只会发出一个事件。

@Override
public ObservableSource<DownloadResponse<File>> apply(Observable<ProgressResult<Response>> upstream) {
    return upstream
            .observeOn(Schedulers.io())
            .filter(new Predicate<ProgressResult<Response>>() {
                @Override
                public boolean test(ProgressResult<Response> progressResult) {
                    return progressResult.getType() == OVER;
                }
            })
            .flatMap(new Function<ProgressResult<Response>, Observable<DownloadResponse<File>>>() {
                @Override
                public Observable<DownloadResponse<File>> apply(final ProgressResult<Response> progressResult) {
                    return Observable.create(new ObservableOnSubscribe<DownloadResponse<File>>() {
                        @Override
                        public void subscribe(ObservableEmitter<DownloadResponse<File>> e) {
                            DownloadResponse<File> result;
                            try {
                                ...
                                result.setStatus(OVER);
                                e.onNext(result);
                            } catch (IOException ex) {
                                result.setStatus(FAIL);
                                e.onError();
                            } finally {
                                ...
                                e.onComplete();
                            }
                        }
                    });
                }
            })
            .observeOn(AndroidSchedulers.mainThread());
}

我同时下载3-4个文件。 但是当我下载完其中一个文件后,经常会收到相同的事件

MyRequestObservable
        .compose(new DownloadTransformer())
        .map(new Function<DownloadResponse<File>, NullObject>() {
            @Override
            public NullObject apply(DownloadResponse<File> fileDownloadResponse) {
                DownloadResponse.NetStatus status = fileDownloadResponse.getStatus();
                if (status != DownloadResponse.NetStatus.OVER) {
                    return NullObject.NULL_OBJECT;
                }
                //File file = fileDownloadResponse.getResponse();
                File imageFile = new File(imageFilePath);
                info.setFile(imageFile);
                //multi same events here...
                Log.d(TAG, "fileDownloadResponse: " + fileDownloadResponse);
                ...
                return NullObject.NULL_OBJECT;
            }
        })
        .safeSubscribe(new BaseObserver<NullObject>(mObservers));

log打印许多相同的目标文件DownloadResponse。为什么apply函数调用了这么多次?
我只想在下载文件后收到一个事件,该怎么办?

1 个答案:

答案 0 :(得分:0)

如果事件接收的事件相同,则可以使用.take(1);如果使用Single,则可以在流结束时使用.firstOrError()关闭接收到的流第一次活动