如何在onComplete(Rxjava2)中使用observable

时间:2017-02-01 15:40:50

标签: java rx-java rx-java2

我尽可能多地使用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我不知道这段代码是否编译,因为我刚刚在这里编写了这个例子。

1 个答案:

答案 0 :(得分:2)

这个怎么样:

webService.getByLastUpdate(syncPreferences.getLastDownloadDate())
    .flatMapCompletable(response ->
        repository
            .insert(response.data)
            .doOnComplete(() ->
                syncPreferences.setLastDownloadDate(response.timeStamp)
            )
    );