android - 也许在房间里不返回数据,但如果我用 asynctask 查询它返回数据?

标签 android rx-android android-room reactive

我正在尝试使用 maybe/Flowable 从房间获取数据,它什么都不返回,但是如果我尝试使用 AsyncTask,它会返回数据。

这里是我的查询:

@Query("SELECT * FROM Media WHERE path LIKE :path")
Maybe<Media> getMediaByPathTest(String path);

和 Activity 中的代码:

                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 和 subscribeOn。您订阅了主线程(阻止您访问数据库)。只需切换那些:

.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())

关于android - 也许在房间里不返回数据,但如果我用 asynctask 查询它返回数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47712243/

相关文章:

php - 从 Android 获取要存储到 php mysql 中的 DatePicker 值

android - 创建一个 Android - Controller - SteamVr 通信

android - 在后台使用而不是在 Activity/Fragment 中使用时如何在 RxJava2 中处理单个观察者

android - 从 Realm 迁移到 Sqlite

java - 安卓架构: call dao method from activity and pass result to child activity for filtering

java - Android:为更小/更大的屏幕调整布局

android - 使用 Espresso Null Pointer 跨多个 Activity 进行测试

android - 如何实现用户输入的周期性处理?

android - 在 Retrofit 中的请求正文之前添加字符串

android - android架构组件中executor的使用