如何在 onComplete 中使用 observable (Rxjava2)
How to use observable in onComplete (Rxjava2)
我正在尽可能多地使用 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我不知道这段代码是否可以编译,因为我只是在这里写它作为示例。
这个怎么样:
webService.getByLastUpdate(syncPreferences.getLastDownloadDate())
.flatMapCompletable(response ->
repository
.insert(response.data)
.doOnComplete(() ->
syncPreferences.setLastDownloadDate(response.timeStamp)
)
);
我正在尽可能多地使用 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我不知道这段代码是否可以编译,因为我只是在这里写它作为示例。
这个怎么样:
webService.getByLastUpdate(syncPreferences.getLastDownloadDate())
.flatMapCompletable(response ->
repository
.insert(response.data)
.doOnComplete(() ->
syncPreferences.setLastDownloadDate(response.timeStamp)
)
);