2017-02-01 3 views
0

J'écris mon application avec autant de rxjava que possible et j'ai le problème suivant.Comment utiliser observable dans onComplete (Rxjava2)

I Avoir une méthode qui synchronise les données avec l'API, et je télécharge des choses basées sur un horodatage. Je voudrais donc le flux de données suivantes:

Obtenir la dernière estampille temporelle -> Télécharger des données -> Enregistrer les données -> horodatage de mise à jour si aucune erreur ne sont survenues

Le problème est que je reçois l'horodatage de la réponse api pour éviter différences de date entre les périphériques, et dès que je transforme la réponse de l'API, je perds l'horodatage.

Voici une simplification du flux de courant:

class Response 
{ 
    Date timeStamp; 
    Data data; 
} 

interface IRepository 
{ 
    Completable insert(Data data); 
} 

interface IWebService 
{ 
    Observable<Response> getByLastUpdate(Date date); 
} 

class SyncPreferences 
{ 
    public Date getLastDownloadDate() { /**/ } 
    public void setLastDownloadDate(Date date){ /**/ } 
} 

public class SyncService 
{ 
    private final IRepository repository; 
    private final IWebService webService; 
    private final SyncPreferences syncPreferences; 

    public SyncService(IRepository repository, SyncPreferences syncPreferences, IWebService webService) 
    { 
     this.repository = repository; 
     this.webService = webService; 
     this.syncPreferences = syncPreferences; 
    } 

    private Completable sync() 
    { 
     return webService.getByLastUpdate(syncPreferences.getLastDownloadDate()) 
      .doOnComplete((response) -> { 
       syncPreferences.setLastDownloadDate(response.timeStamp) 
      }) // What I would like to do 
      .flatMapCompletable((response) -> { 
       repository.insert(response.data); 
      }); 
    } 
} 

Le problème est que la méthode doOnComplete ne reçoit pas le paramètre (response) de l'observable et je voudrais mettre l'horodatage comme la dernière chose si Si une erreur se produit, je peux réessayer de télécharger avec l'ancien horodatage.

La seule solution que j'ai trouvé faire un mécanisme de transaction dans le SyncPreferences que je pouvais utiliser comme ceci:

private Completable sync() 
    { 
     return webService.getByLastUpdate(syncPreferences.getLastDownloadDate()) 
      .doOnNext((response) -> { 
       syncPreferences.setLastDownloadDate(response.timeStamp); 
      }) 
      .flatMapCompletable((response) -> { 
       repository.insert(response.data); 
      }) 
      .andThen(syncPreferences.commitChanges()); 
    } 

Je suis nouveau à RxJava donc si vous avez des suggestions en général, je serais heureux de savoir = PS

PS Je ne sais pas si ce code compile puisque je viens de l'écrire ici pour l'exemple.

Répondre

2

Qu'en est-ce:

webService.getByLastUpdate(syncPreferences.getLastDownloadDate()) 
    .flatMapCompletable(response -> 
     repository 
      .insert(response.data) 
      .doOnComplete(() -> 
       syncPreferences.setLastDownloadDate(response.timeStamp) 
      ) 
    );