也许在房间内不返回数据,但是如果我使用aysnctask进行查询,它将返回数据



我试图使用可能/流动的返回从房间获取数据,但如果我尝试使用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())

最新更新