我对Room和Rx完成有一个奇怪的问题。易于复制。问题出在线程上,但不明白为什么。
当我订阅Rx completable并等待插入成功时,使用另一个线程时结果表上的下一个选择(选择最大值或计数)将无法工作。
val entryTable = TestDbUtil.createEntryTable(
entry.id, // 1
entryTableFieldId, // 1
rowIndexExpected // row index: 123
)
// Insert a row in entry table object with entry.id = 1 and field.id = 1 and row index is 1234
// The insert is a Completable, we subscribe to it to get the result insertion
// When insert is success, we are looking to get the max row index from it.
entryTableDao.insert(entryTable).subscribe({
Executors.newSingleThreadExecutor().execute { // With thread I have an error here!! Without this line it's working fine
val max = entryTableDao.findMaxRowIndex(entry.id, entryTable.fieldId)
Assert.assertEquals(rowIndexExpected, max) // Always 0 but should be 123
}
},
{ error ->
Assert.assertNull(error)
}
...
我尝试了多种方法,例如到处都是rx,但是我遇到了同样的问题。 可能是与交易有关的问题?
修改
有了注释,我可以像doOnComplete和Schedulers.from(executor)这样使用来做。这对我的TU有效,但在我的应用程序中却没有任何作用。
代码在这里:
fun getMaxIndex(entryId: String, fieldId: Int): LiveData<Int> {
val result = MutableLiveData<Int>()
entryTableDao.findMaxRowIndex(entryId, fieldId)
.subscribeOn(Schedulers.single())
.observeOn(AndroidSchedulers.mainThread())
.doOnSuccess {
// Never called even if there are some data in db...
result.value = it
}
.doOnError {
// Not called.
result.value = 0
}
.doOnComplete {
// Always called, obviously, but I don't have the onSuccess.
result.value = 0
}
.subscribe()
return result
}
问题:
从插入结果成功后,TU调用findMaxRowIndex,即使代码未显示,在我的应用程序中它也是相同的行为。
答案 0 :(得分:0)
如评论中所述,与doOnComplete组合可以满足您的需求。 Completable具有onComplete和onError,因此如果您需要在此之后做一些事情,可以使用doOnComplete。
以下是Completable的官方文档:Completable: doOnComplete
如果您需要在后台线程上创建东西,则应使用RxJava subscriptionOn。更多内容:Understanding RxJava subscribeOn and observeOn。如果您想使用执行器,仍可以通过
Schedulers.from(执行器执行器)