我尽可能多地使用rxjava编写我的应用程序,并且我遇到了以下问题。
我有一个与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
方法没有从observable接收参数(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的新手,所以如果你有一般的建议,我会很高兴知道=]
P.S我不知道这段代码是否编译,因为我刚刚在这里编写了这个例子。
答案 0 :(得分:2)
这个怎么样:
webService.getByLastUpdate(syncPreferences.getLastDownloadDate())
.flatMapCompletable(response ->
repository
.insert(response.data)
.doOnComplete(() ->
syncPreferences.setLastDownloadDate(response.timeStamp)
)
);