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

标签 java android retrofit rx-java rx-android

我正在使用 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/

相关文章:

android - LinearLayout 被 AppBarLayout 覆盖

java - 通过 OkHttp 拦截器拦截和重试调用

java - 我如何在 Retrofit2 中使用 jsonapi?

android - 如何使用 Json(类别和子类别)在 Android fragment 中显示 GridView 图像

java - 我如何从另一个函数/方法调用变量?

java 8 时间 api - Instant.now(clock) 与 LocaldateTime.now(clock)

java - 检查字符串中是否存在模式

android - 如何检查 firebase 查询是否为空

java - android 4.0.3 中可以进行多播编程吗?

php - 从android在php服务器上上传多个图像