可热完成 运行 长任务
Hot Completable with long running tasks
默认Completable
不热。但我遇到了 hot Completable 非常有用的情况:下载和缓存大文件集:
class DownloadManager {
Completable downloadAndCacheA();
Completable downloadAndCacheB();
}
Completable.merge(
downloadManager.downloadAndCacheA(),
downloadManager.downloadAndCacheB()
).subscribe();
当文件很大时,用户可以离开应用程序并返回。因此客户端代码可以取消订阅这些可完成项并再次订阅。可以下载一个文件,但另一个文件仍在下载中。但是由于Completable
不是热下载又开始了
可能的选择是:
- 制作hot Completable.
- 使用 returns
Object
. 的热 Observable
- 仅使用
Thread
个具有自定义 Completable
的实例,它们相互交互。
由于不同的原因,不是很喜欢所有这些解决方案。有没有更好的方法来支持长时间 运行 可完成的任务?
使用 cache,由 akarnokd 建议,可能是最简单的方法。
public Completable downloadAndCache() {
if (completable == null) {
completable = Completable.fromAction(this::syncDownloadAndCache)
.cache();
}
return completable;
}
默认Completable
不热。但我遇到了 hot Completable 非常有用的情况:下载和缓存大文件集:
class DownloadManager {
Completable downloadAndCacheA();
Completable downloadAndCacheB();
}
Completable.merge(
downloadManager.downloadAndCacheA(),
downloadManager.downloadAndCacheB()
).subscribe();
当文件很大时,用户可以离开应用程序并返回。因此客户端代码可以取消订阅这些可完成项并再次订阅。可以下载一个文件,但另一个文件仍在下载中。但是由于Completable
不是热下载又开始了
可能的选择是:
- 制作hot Completable.
- 使用 returns
Object
. 的热 Observable
- 仅使用
Thread
个具有自定义Completable
的实例,它们相互交互。
由于不同的原因,不是很喜欢所有这些解决方案。有没有更好的方法来支持长时间 运行 可完成的任务?
使用 cache,由 akarnokd 建议,可能是最简单的方法。
public Completable downloadAndCache() {
if (completable == null) {
completable = Completable.fromAction(this::syncDownloadAndCache)
.cache();
}
return completable;
}