Room Thread, RxJava, выберите выпуск - PullRequest
0 голосов
/ 25 февраля 2019

У меня странная проблема с возможностью завершения комнаты и приема.Легко воспроизвести, хотя.Проблема из потока, но не понимаю, почему ..

Когда я подписываюсь на 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
}

Вопросы:

  1. Как я могу проверить это поведение в моем TU?Как и в основном потоке наблюдаем в главном потоке, потому что я не могу его воспроизвести.
  2. Во втором фрагменте кода, в чем разница, подписаться {result ->} и doOnSuccess {result ->}
  3. Во втором фрагменте кода, почему у меня нет данных ответа?Я потратил так много времени на эту проблему ... Я не могу понять ...

TU вызывает findMaxRowIndex после успешного завершения вставки, в моем приложении такое же поведение, дажеесли код не показывает это.

1 Ответ

0 голосов
/ 25 февраля 2019

Как обсуждалось в комментариях, комбинации с doOnComplete будет достаточно для того, что вам нужно.У Completable есть onComplete и onError, поэтому, если вам нужно что-то сделать после этого, вы можете использовать doOnComplete.
Ниже приведена официальная документация Completable: Completable: doOnComplete
В случае, если вам нужно создать что-то в фоновом потоке, вы должны использовать RxJava subscribeOn.Подробнее здесь: Понимание подписки RxJava и наблюдения за .Если вы хотите использовать Executor, вы все равно можете сделать это через

Schedulers.from (Executor executor)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...