android - 当 Observable 在 Schedulers.io() 上订阅时从不正确的线程访问 Realm

标签 android realm rx-android

我订阅了 IO 调度程序。

getObservableItems(itModel).subscribeOn(Schedulers.io()).
                onBackpressureBuffer().
                observeOn(AndroidSchedulers.mainThread()).
                subscribe(new Observer<List<ItemModel>>() {
                    @Override
                    public void onCompleted() {
                    }

                    @Override
                    public void onError(Throwable e) {
                    }

                    @Override
                    public void onNext(List<ItemModel> resultItemModel) {
                    }
                });

这是我在做 Realm 交易的地方

private Observable<List<ItemModel>> getObservableItems(ItModel itModel) {
        return Observable.create(subscriber -> {
            realm = Realm.getInstance(mContext);
            if (itModel != null) {
                ArrayList<String> ids = ProjectUtil.getId(itModel.getRequestUrl());
                DatabaseHelper.saveItemCategory(realm, itModel, ids.get(0), ids.get(1));
            }
            RealmQuery<ItemModel> itemModelRealmQuery = realm.where(ItemModel.class);
            /* Error on below line */
            resultItemModel = itemModelRealmQuery.equalTo("res_id", subCategoryModel.getId()).
                    equalTo("menu_grp_id", subCategoryModel.getMenu_grp_id()).findAll();
            subscriber.onNext(resultItemModel);
            subscriber.onCompleted();
        });
    }

最佳答案

这是因为您将 .subscribeOn(Schedulers.IO()observeOn(AndroidSchedulers.mainThread()) 组合在一起。

这意味着您在 io() 线程上执行工作,但尝试在主线程上使用结果。这目前违反了 Realms 线程策略,因为我们使用线程限制对象。我们在此处支持此用例时遇到问题:https://github.com/realm/realm-java/issues/1208

在那之前,您要么必须将 Realm 数据复制到标准 Java 对象,要么在同一线程上执行所有 Realm 操作(通过删除 subscribeOn/observeOn)。

关于android - 当 Observable 在 Schedulers.io() 上订阅时从不正确的线程访问 Realm ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32795719/

相关文章:

java - Android/google 无特定原因的 ANR 崩溃

java - 共享元素转换后如何使用动画

java - Android Realm 无法构建javax/annotation/CheckForNull.class

java - Android Realm Java 0.82.1 ArrayIndexOutOfBoundsException

android - RxJava2。对列表中的每个项目执行请求

android - RxJava : Error occurred when trying to propagate error to Observer. onError

java - RxAndroid 改造问题?

android - 无法在 Android Studio 3 中将外部项目作为模块导入

android - 构造函数 Intent 未定义错误

android - 使用 MYSQL 查询结果进行 Realm 查询