Rxjava和工作管理器链接了异步调用

时间:2019-08-27 10:11:08

标签: android rx-java2 android-workmanager

更新:这就是我以前的insertIntoDb方法不起作用的样子:

private Completable insertIntoDb(List<ArticleEntity> articleItemEntities) {
    return database.articleDao().insertArticles(articleItemEntities)
            .observeOn(Schedulers.io());
}

我将其更改为以下内容,现在可以使用了:

 private void insertIntoDbNew(List<ArticleEntity> articleItemEntities) {
        mCompositeDisposable.add(
                database.articleDao().insertArticles(articleItemEntities)
                        .subscribeOn(Schedulers.io())
                        .subscribe());

    }

我不知道为什么,但是现在可以了。确保工作程序在数据库插入完成之前完成,但这似乎不是我以前相信的问题。

更新结束。

我是反应式编程的新手。我的目标是安排一个工作经理执行4个动作,然后使用RxJava2返回结果。这是我要执行的任务

  1. 进行网络api调用。
  2. 构造从API调用中获取的数据。
  3. 将其插入我们的本地会议室数据库中。
  4. 一切就绪后,Result.success()返回工作,以便知道一切正常,可以终止。

所以我偏爱的方法看起来像这样。

public Result doWork(){
    return api.get("URL") responseData -> structureData(responseData) structuredData -> insertIntoDB(structuredData) -> Result.success()
}

我正在使用RxJava2和RxWorker类。

以下是我当前的解决方案。这是正确的还是我做错了什么?

public class DownloadWorker extends RxWorker {

    @Override
    public Single<Result> createWork() {
        return apiService.download("URL")
                .map(response -> processResponse(response))
                .doOnSuccess(data -> insertIntoDb(data))
                .flatMap(response ->
                        allComplete()
                )
                .observeOn(Schedulers.io());
    }

    Single<Result> allComplete() {
        return Single.just(Result.success());
    }

}

它的行为就像我想要的那样。它下载数据,对其进行结构化,然后将其插入DB中,然后返回Result.success()。但是我不知道我在做什么。我是否按预期使用RxJava?

这部分也困扰我:

.flatMap(response -> allComplete())

响应部分是多余的,我可以通过某种方式将其删除吗?

1 个答案:

答案 0 :(得分:4)

我对您的代码做了一些改进:

public class DownloadWorker extends RxWorker {

    @Override
    public Single<Result> createWork() {
        return apiService.download("URL")
                .map(response -> processResponse(response))
                .flatMapCompletable(articleItemEntities -> database.articleDao().insertArticles(articleItemEntities))
                .toSingleDefault(Result.success())
                .onErrorReturnItem(Result.failure())
                .observeOn(Schedulers.io());
    }
}

在原始代码中,您使用doOnSuccess方法保存数据,这是一个副作用。如您在评论中所述,insertIntoDb()方法返回Completable。因此,我将doOnSuccess(data -> insertIntoDb(data))更改为flatMapCompletable(data -> insertIntoDb(data)),这将使您确保成功存储数据并等待其完成。由于insertIntoDb()方法返回Completable,而createWork()方法必须返回Result,因此我们现在必须将类型从Completable更改为Single<Result>。因此,我使用了toSingleDefault,它默认情况下返回Result.success()。另外,我添加了onErrorReturnItem(Result.failure()),它将允许 RxWorker 跟踪错误。希望我的回答有帮助。