Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对已在AndroidSchedulers.mainThread()上观察到的对象使用blockingGet()_Android_Rx Java2_Rx Android - Fatal编程技术网

对已在AndroidSchedulers.mainThread()上观察到的对象使用blockingGet()

对已在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

我的应用程序的Room数据库被包装在一个RxJava2数据访问层中,该层修改所有单曲、可能等,以订阅Schedulers.io()调度器,并观察AndroidSchedulers.mainThread()调度器

这被认为是一个好主意,因为如果您试图在主线程之外修改UI,有时Android会出现错误行为,这是完成查询时的典型行为

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
});