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我不知道这段代码是否编译完成,因为我只是在这里写了这个例子。