可热完成 运行 长任务

Hot Completable with long running tasks

默认Completable不热。但我遇到了 hot Completable 非常有用的情况:下载和缓存大文件集:

class DownloadManager {
  Completable downloadAndCacheA();
  Completable downloadAndCacheB();
}

Completable.merge(
  downloadManager.downloadAndCacheA(),
  downloadManager.downloadAndCacheB()
).subscribe();

当文件很大时,用户可以离开应用程序并返回。因此客户端代码可以取消订阅这些可完成项并再次订阅。可以下载一个文件,但另一个文件仍在下载中。但是由于Completable不是热下载又开始了

可能的选择是:

由于不同的原因,不是很喜欢所有这些解决方案。有没有更好的方法来支持长时间 运行 可完成的任务?

使用 cache,由 akarnokd 建议,可能是最简单的方法。

public Completable downloadAndCache() {
   if (completable == null) {
          completable = Completable.fromAction(this::syncDownloadAndCache)
                                   .cache();
   }
   return completable;
}