我正在使用retrofit和rxjava从网络下载一些文件。在我的应用程序中,用户可以取消下载。
伪代码:
Subscription subscription = Observable.from(urls)
.concatMap(this::downloadFile)
.subscribe(file -> addFileToUI(file), Throwable::printStackTrace);
现在,如果我取消订阅此订阅,则所有请求都会被取消。我想逐个下载,这就是使用concatMap的原因。如何取消特定请求?
答案 0 :(得分:3)
有一种机制可以通过外部刺激取消个人流量:takeUntil
。你必须使用一些外部跟踪:
ConcurrentHashMap<String, PublishSubject<Void>> map =
new ConcurrentHashMap<>();
Observable.from(urls)
.concatMap(url -> {
PublishSubject<Void> subject = PublishSubject.create();
if (map.putIfAbsent(url, subject) == null) {
return downloadFile(url)
.takeUntil(subject)
.doAfterTerminate(() -> map.remove(url))
.doOnUnsubscribe(() -> map.remove(url));
}
return Observable.empty();
})
.subscribe(file -> addFileToUI(file), Throwable::printStackTrace);
// sometime later
PublishSubject<Void> ps = map.putIfAbsent("someurl", PublishSubject.create());
ps.onCompleted();