Горячее завершение с длительными задачами

По умолчанию Completable не горячий. Но у меня есть случай, когда горячий Completable был бы действительно полезен: загрузка и кеширование набора больших файлов:

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

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

Когда файлы большие, пользователь может выйти из приложения и вернуться назад. Таким образом, клиентский код может отказаться от подписки на эти дополнения и снова подписаться. Один файл можно скачать, а другой еще в процессе. Но так как Completable не горячая загрузка начинается снова.

Возможные варианты:

  • Сделайте горячим дополнением.
  • Используйте горячий Observable, который возвращает Object.
  • Используйте только экземпляр Thread с пользовательскими Completable, которые взаимодействуют друг с другом.

Не очень нравятся все эти решения по разным причинам. Есть ли лучший способ поддерживать длительные завершаемые задачи?


person eleven    schedule 03.02.2017    source источник
comment
Вы смотрели Completable.cache и CompletableSubject.   -  person akarnokd    schedule 03.02.2017
comment
@akarkd спасибо! Пробовал кеш но наверное по другому. Снова посмотрим на кеш и CompletableSubject.   -  person eleven    schedule 03.02.2017


Ответы (1)


Использование кеша, предложенное akarnokd , пожалуй, самый простой способ.

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