我有一个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函数调用了这么多次?
我只想在下载文件后收到一个事件,该怎么办?
答案 0 :(得分:0)
如果事件接收的事件相同,则可以使用.take(1)
;如果使用Single
,则可以在流结束时使用.firstOrError()
关闭接收到的流第一次活动