У меня странная проблема с возможностью завершения комнаты и приема.Легко воспроизвести, хотя.Проблема из потока, но не понимаю, почему ..
Когда я подписываюсь на Rx, завершаемый и жду успеха вставки, следующий выбор (выбрать максимум или количество) в таблице результатовне работает при использовании другого потока.
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?Как и в основном потоке наблюдаем в главном потоке, потому что я не могу его воспроизвести.
- Во втором фрагменте кода, в чем разница, подписаться {result ->} и doOnSuccess {result ->}
- Во втором фрагменте кода, почему у меня нет данных ответа?Я потратил так много времени на эту проблему ... Я не могу понять ...
TU вызывает findMaxRowIndex после успешного завершения вставки, в моем приложении такое же поведение, дажеесли код не показывает это.