2017-02-01 7 views
0

私はできるだけ多くのrxjavaで自分のアプリケーションを書いていますが、次の問題があります。oncomplete(Rxjava2)でobservableを使用する方法

私は、APIとデータを同期させる方法があり、タイムスタンプに基づいてデータをダウンロードします。だから私は、次のデータの流れをしたいと思います:

が最後のタイムスタンプを取得する - >ダウンロードデータ - >保存データ - >更新のタイムスタンプエラーが

を発生しましたしない場合、問題は、私は避けるために、APIレスポンスからタイムスタンプを受け取るということですデバイス間の日付の違い、そして私がAPIからの応答を変換するとすぐに私はタイムスタンプを失う。ここで

は、電流の流れを簡略化したものである:

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); 
      }); 
    } 
} 

問題はdoOnComplete方法が観測から、パラメータ(response)を受信しないと、私はそう最後のものとして、タイムスタンプを設定したいということですエラーが発生した場合は、古いタイムスタンプでダウンロードを再試行できます。私が見つけた唯一の解決策は、私はこのように使用することができSyncPreferencesで取引メカニズムを作りました

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

あなたは私が知って喜んでいるだろう一般的な提案を持っているので、もし私がRxJavaに新しいです= ]

PSこのコードがコンパイルされているかどうかは、ここでは例として書いてあるので、わかりません。

答えて

2

これは何について:

webService.getByLastUpdate(syncPreferences.getLastDownloadDate()) 
    .flatMapCompletable(response -> 
     repository 
      .insert(response.data) 
      .doOnComplete(() -> 
       syncPreferences.setLastDownloadDate(response.timeStamp) 
      ) 
    ); 
関連する問題