对已在AndroidSchedulers.mainThread()上观察到的对象使用blockingGet()
我的应用程序的Room数据库被包装在一个RxJava2数据访问层中,该层修改所有单曲、可能等,以订阅Schedulers.io()调度器,并观察AndroidSchedulers.mainThread()调度器 这被认为是一个好主意,因为如果您试图在主线程之外修改UI,有时Android会出现错误行为,这是完成查询时的典型行为对已在AndroidSchedulers.mainThread()上观察到的对象使用blockingGet(),android,rx-java2,rx-android,Android,Rx Java2,Rx Android,我的应用程序的Room数据库被包装在一个RxJava2数据访问层中,该层修改所有单曲、可能等,以订阅Schedulers.io()调度器,并观察AndroidSchedulers.mainThread()调度器 这被认为是一个好主意,因为如果您试图在主线程之外修改UI,有时Android会出现错误行为,这是完成查询时的典型行为 public <T> Maybe<T> flow(Maybe maybe) { return maybe .sub
public <T> Maybe<T> flow(Maybe maybe) {
return maybe
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
在数据源中:
public Maybe<Book> getBookWithId(long bookId) {
return mReservoir.flow(mBooksDao.getBookWithId(bookId));
//The reservoir is the class containing the flow method from further above.
}
public-getBookWithId(长bookId){
返回mReservoir.flow(mBooksDao.getBookWithId(bookId));
//储层是包含上述流动方法的类别。
}
在书中:
@Transaction @Query("SELECT ...")
public abstract Maybe<Book> getBookWithId(long bookId);
@Transaction@Query(“选择…”)
公共摘要可能是getBookWithId(长bookId);
我认为Sanlok Lee的评论是正确的,您正在主线程上调用blockingGet()
。这就是忽略调度程序。因此,您可以使用执行器服务,或尝试以下操作:
Schedulers.io().scheduleDirect(() -> {
final Book book = mBooksDataSource.getBookWithId(1L).blockingGet();
//Do something with the book
});
您是否尝试过使用单独的计划程序设置另一个
observeOn()
?(例如,flow(…).observeOn(io())
)我有过,但不幸的是,我仍然经历过同样的行为…这很奇怪-下面的所有observeOn()
都应该在指定的调度程序上执行。你能在你的问题中添加更多的代码来说明你是如何使用这个方法的,或者其他任何可能有助于诊断它的东西吗?@PPartisan我添加了更多的代码。此应用程序来自我的工作,因此我无法粘贴整个类。我可以在GitHub中创建一个示例应用程序,如果您认为这会进一步澄清的话。谢谢。你确定吗代码>行正在从工作线程调用blockingGet()
将阻止当前线程,而不管流中使用的调度程序是什么。即使完全删除flow()
调用,问题仍然会存在。
Schedulers.io().scheduleDirect(() -> {
final Book book = mBooksDataSource.getBookWithId(1L).blockingGet();
//Do something with the book
});