我试图使用可能/流动的返回从房间获取数据,但如果我尝试使用asynctask的返回数据。
在这里我的查询:
@Query("SELECT * FROM Media WHERE path LIKE :path")
Maybe<Media> getMediaByPathTest(String path);
和活动中的代码:
AppDatabase.getInstance(getActivity()).mediaDao()
.getMediaByPathTest(getCurrentMedia().getPath())
.observeOn(Schedulers.io())
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(media -> {
if (media != null && media.isFavourite()) {
Toast.makeText(SingleMediaActivity.this,
"Bingo I m favorite", Toast.LENGTH_SHORT).show();
}
}, throwable -> {
}
, () -> {
});
它的显示错误
w/system.err:java.lang.illegalstateException:无法在主线程上访问数据库,因为它可能会长时间锁定UI。
我做错了什么,怎么做正确的?
您在观察和订阅周围切换。您在主线程上订阅(阻止您访问数据库)。只需切换这些:
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
您需要在线程中进行房间操作。
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())