如何使用过多的 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 中所述。
我正在尝试使用 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())
之类的东西,如