[英]subscribeOn() not taking work off the main thread
我正在使用RxJava2和Room SQLite。 我的DAO:
@Dao
public interface HeroDao {
@Insert
long create(Hero hero);
}
这就是我在RxJava2中使用它的方式:
Observable.just((int) heroDao.create(hero))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(id -> /** do stuff **/);
但是当我运行应用程序时,我在Logcat中遇到的错误是Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
我已经尝试将.allowMainThreadQueries()
附加到数据库构建器并且插入经过,以确认我的observable的正确性。 看来LiveData和AsyncTasks是我可以尝试的其他方法,但是当我已经对RxJava2进行了大量投资时,我宁愿不去那里。
那么为什么我会收到这个错误? 是不是subscribeOn(Schedulers.io())
足以卸载主线程的工作? 否则我该怎么做? 似乎有一些细微之处在于将房间查询转换为我遗漏的可观察对象?
这是因为你使用了Observable.just
。 此方法只是将对象包装到Observable
,因此它在实际订阅之前创建,并在主线程上调用heroDao.create(hero)
。 你应该使用Observable.fromCallable()
,或者更喜欢Single.fromCallable
。 你也可以在DAO中定义方法,比如@Insert Single<Int> create(Hero hero);
有一些链接可能会有所帮助:
使用RxJava在Room中进行查询
7个房间的专业提示
@Dmitry Ikryanov的答案是正确的,但你也可以使用defer()
createQuery().subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(intger -> {
//do sth with intege
Thread.currentThread().getName());
},
Throwable::printStackTrace
);
}
public Observable<Integer> createQuery() {
return Observable.defer(() -> {
try {
return Observable.just((Integer) heroDao.create(hero));
} catch (Exception e) {
return Observable.error(e);
}
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.