2017-02-01 27 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) 
      ) 
    ); 
相关问题