gpt4 book ai didi

java - 如何使用 RxJava 取消 Retrofit 中的单个网络请求?

转载 作者:搜寻专家 更新时间:2023-11-01 08:23:22 27 4
gpt4 key购买 nike

我正在使用 retrofit 和 rxjava 从网络下载一些文件。在我的应用程序中,用户可以取消下载。

伪代码:

   Subscription subscription = Observable.from(urls)
.concatMap(this::downloadFile)
.subscribe(file -> addFileToUI(file), Throwable::printStackTrace);

现在,如果我取消订阅,那么所有请求都会被取消。我想一个一个下载,所以才用了concatMap。如何取消特定请求?

最佳答案

有一种机制可以通过外部刺激取消单个流: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();

关于java - 如何使用 RxJava 取消 Retrofit 中的单个网络请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47844512/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com