2017-02-03 5 views
1

Par défaut Completable n'est pas chaud. Mais j'ai cas où chaud serait vraiment pouvant être complétée utile: le téléchargement et l'ensemble de la mise en cache de fichiers volumineux:Hot Completable avec des tâches longues

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

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

Lorsque des fichiers sont grand utilisateur peut quitter l'application et revenir en arrière. Ainsi, le code client peut se désabonner de ces complétables et s'abonner à nouveau. Un fichier peut être téléchargé, mais un autre est toujours en cours. Mais comme Completable n'est pas chaud, le téléchargement recommence.

Options possibles est à:

  • Faire hot Completable.
  • Utilisez la fonction d'observation chaude qui renvoie Object.
  • Utilisez simplement Thread instance avec le Completable personnalisé qui interagissent les uns avec les autres.

N'aiment pas vraiment toutes ces solutions pour des raisons différentes. Existe-t-il un meilleur moyen de prendre en charge des tâches exécutables de longue durée?

+1

Avez-vous regardé [Completable.cache] (http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Completable.html#cache()) et [CompletableSubject] (http : //reactivex.io/RxJava/2.x/javadoc/io/reactivex/subjects/CompletableSubject.html). – akarnokd

+0

@akarnokd merci! Le cache essayé mais probablement d'une manière différente. Regardera à nouveau cache et CompletableSubject. – eleven

Répondre

1

L'utilisation de cache, suggérée par akarnokd, est probablement le moyen le plus simple.

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