Android 如何使用太多可完成的方法执行顺序操作

Android 如何使用太多可完成的方法执行顺序操作,android,kotlin,rx-java2,android-room,Android,Kotlin,Rx Java2,Android Room,我正试图用Room将服务器上的数据保存到本地数据库。由于这些表相互关联,我希望插入操作按顺序进行。例如,我有学校和季节的表格,这就是我添加数据的方式: fun insertAllSchools(vararg schools: School):Completable=dao.insertAll(*schools) fun insertAllSeasons(vararg seasons: Season):Completable=dao.insertAll(*seasons) 当我为每个表创建一个

我正试图用Room将服务器上的数据保存到本地数据库。由于这些表相互关联,我希望插入操作按顺序进行。例如,我有学校和季节的表格,这就是我添加数据的方式:

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

fun insertAllSeasons(vararg seasons: Season):Completable=dao.insertAll(*seasons)
当我为每个表创建一个单独的方法时,插入过程就完成了,但我必须为每个表编写一个一次性方法。像这样:

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)
                                }

                            })
            )
        }
    }

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

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

例如,我尝试以这种方式组合它:

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")
                                }
                            })
            )
        }

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

我不同意使用
doOnComplete()
。在这种情况下,您不能将这些可完成事件组合成一个您可以观察到的可完成事件。您可能需要的是类似于
doThingA()。和(Completable.defer(()->doThingB())
的内容,如在回答类似问题时所述

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)
                                }

                            })
            )
        }