2017-02-01 49 views
0

我正在用我的rxjava編寫我的應用程序,並遇到以下問題。如何在onComplete中使用observable(Rxjava2)

我有一個方法與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) 
      ) 
    ); 
相關問題