如何使用过多的 Completable 方法执行顺序操作

How to perform sequential operation with too much Completable methods

我正在尝试使用 Room 将服务器上的数据保存到本地数据库。由于这些 table 是相互关联的,所以我希望插入在 order.I 中完成,用 RxJava 监听这些操作。例如,我有学校和季节的 tables,这就是我添加数据的方式:

fun insertAllSchools(vararg schools: School):Completable=dao.insertAll(*schools)

fun insertAllSeasons(vararg seasons: Season):Completable=dao.insertAll(*seasons)

当我为每个 table 创建一个单独的方法时,插入过程已完成,但我必须为每个方法编写一个一次性方法。像这样:

fun insertAllSchools(allData:ResponseAll){
        if(allData.schoolList!=null){
            disposable.add(
                    repositorySchool.insertAll(*allData.schoolList.toTypedArray())
                            .subscribeOn(Schedulers.io())
                            .observeOn(AndroidSchedulers.mainThread())
                            .subscribeWith(object : DisposableCompletableObserver(){
                                override fun onComplete() {
                                    Log.d(TAG,"OnComplete")
                                }
                                override fun onError(e: Throwable) {
                                    Log.e(TAG,"Error"+e.localizedMessage)
                                }

                            })
            )
        }
    }

当一个完成后,我调用了另一个方法,但是这次有很多不必要的代码。

我尝试了不同的方法来组合这些复杂的table方法并按顺序工作,但它不会添加到数据库中,即使它出现在日志中。

比如我试过这样组合:

if(allData.schoolList!=null){
            mObservable = Observable.fromArray(
                    repositorySchool.clearAllData(),
                    repositorySchool.insertAll(*allData.schoolList.toTypedArray())
            )

            disposable.add(
                    mObservable
                            .subscribeOn(Schedulers.io())
                            .observeOn(AndroidSchedulers.mainThread())
                            .subscribeWith(object : DisposableObserver<Completable>() {
                                override fun onComplete() {
                                    Log.d(TAG,"onComplete")
                                    isDataLoad.value = true
                                }
                                override fun onNext(t: Completable) {
                                    Log.d(TAG,"onNext"+t)
                                }
                                override fun onError(e: Throwable) {
                                    Log.e(TAG,"onError")
                                }
                            })
            )
        }

我没有收到任何错误。我如何组合这些 completable 方法并使它们按顺序工作。谢谢!

编辑(解决方案):它是这样工作的:------------>

if(allData.schoolList!=null) {
            disposable.add(
                    repositorySchool.clearAllData()
                            .andThen(Completable.defer { repositorySchool.insertAll(*allData.schoolList.toTypedArray()) })
                            .subscribeOn(Schedulers.io())
                            .observeOn(AndroidSchedulers.mainThread())
                            .subscribeWith(object : DisposableCompletableObserver() {
                                override fun onComplete() {
                                    isDataLoad.value = true
                                }

                                override fun onError(e: Throwable) {
                                    Log.e(TAG,""+e.localizedMessage)
                                }

                            })
            )
        }

有一个名为 doOnComplete() 的方法,您可以使用它通过 lambda 或 jack 进行第二次调用。

我不同意使用 doOnComplete()。在那种情况下,您不会将 Completables 组合成一个您可以观察到的 Completable 事件。您可能想要的是 doThingA().andThen(Completable.defer(() -> doThingB()) 之类的东西,如 answer on a similar question 中所述。