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我不知道這段代碼是否編譯完成,因爲我只是在這裏寫了這個例子。