База данных Room моего приложения обернута в слой доступа к данным RxJava2, который изменяет все Singles, Maybes и т. Д. Для подписки на планировщик Schedulers.io () и наблюдения на Android-планировщиках . mainThread () планировщик.
Это считалось хорошей идеей, потому что иногда Android ведет себя неправильно, если вы пытаетесь изменить пользовательский интерфейс вне основного потока, что является типичным поведением по завершении запроса.
public <T> Maybe<T> flow(Maybe maybe) {
return maybe
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
Теперь у меня есть часть моего приложения, которая требует синхронного извлечения элемента из базы данных. Мой дизайн не ожидал этого. Когда я выполняю #blockingGet (), у меня возникает тупик, о котором я читал в других вопросах, таких как этот .
Есть ли способ изменить поток, чтобы он фактически не наблюдался на основном потоке в крайнем случае, когда мне нужно синхронно получить некоторые данные? Или мне придется полностью переоценить этот дизайн, чтобы каждый отдельный вызов решал, какой планировщик используется для наблюдения?
-
В моей Деятельности при взаимодействии с элементом пользовательского интерфейса:
Book book = mBooksDataSource.getBookWithId(1L)
.observeOn(Schedulers.io())
.blockingGet();
Log.d(LOG_TAG, "I am here."); //Never reached
В источнике данных:
public Maybe<Book> getBookWithId(long bookId) {
return mReservoir.flow(mBooksDao.getBookWithId(bookId));
//The reservoir is the class containing the flow method from further above.
}
В Книге Дао:
@Transaction @Query("SELECT ...")
public abstract Maybe<Book> getBookWithId(long bookId);