Rxjava - flatmap в том же потоке

У меня есть вложенные элементы в моей базе данных, например, дом - комнаты. Если я удалю дом, я также хочу удалить все комнаты, но я не хочу об этом думать, поэтому дом должен это знать. Итак, моя установка будет выглядеть примерно так:

fun deleteHouse(item: House): Single<House> {
    houseObservable // emits List<House>
        .take(1)
        .map { 
            DBManager.beginTransaction()
            it
        }
        .flatMapIterable { it }
        .flatMapSingle { deleteRoom(it) }
        .toList()
        .map { 
            DBManager.deleteWithoutDependencies(item)
            DBManager.endTransaction()
            item
        }
}

fun deleteRoom(item: Room): Single<Room> {
    roomObservables // emits List<Room>
        .take(1)
        .map { 
            DBManager.beginTransaction()
            it
        }
        .flatMapIterable { it }
        .flatMapSingle { DBManager.deleteWithoutDependencies(item) }
        .toList()
        .map { 
            DBManager.endTransaction()
            item
        }
}

Проблема

Каждый элемент удаляется на RxComputationThread-1, а также на всех beginTransaction и endTransaction, НО - последний endTransaction, завершивший удаление дома.

Мне нужно запустить все действия с базой данных в одном потоке, иначе база данных заблокируется ...

Есть идеи, как это решить?

Идея

Передайте использованный Schedular в функции и используйте его в flatMaps, но действительно ли это необходимо для решения этой проблемы?

Создайте однопоточный Scheduler и примените observeOn непосредственно перед этими map и, скорее всего, subscribeOn на deleteWithoutDependencies.

akarnokd 14.09.2018 09:58

Я попробую это. Кроме того, я создал полный пример, который полностью соответствует моему реальному варианту использования здесь: github.com/MFlisar/tests/blob/master/app/src/main/java/com/… Странно то, что пример работает отлично - все выполняется в одном потоке. Это случайно?

prom85 14.09.2018 10:30

Я пробовал использовать наблюдение на Schedulers.single() в самом внешнем потоке И перед каждой картой, которая начинает / завершает транзакцию, и перед каждой картой, на которой элемент удаляется из базы данных, и это работает. Недостаточно не использовать какие-либо расписания в середине потока и использовать только Schedulers.single() во внешнем потоке. Странно, потому что в моей демонстрации на github я вижу, что ВСЕ карты выполняются в одном потоке, который передан в функцию observeOn основных потоков ...

prom85 14.09.2018 10:56
0
3
255
0

Другие вопросы по теме