【问题标题】:Realm access from incorrect thread when Observable subscribed on Schedulers.io()当 Observable 在 Schedulers.io() 上订阅时,来自错误线程的领域访问
【发布时间】:2015-09-26 09:38:13
【问题描述】:

我订阅了 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();
        });
    }

【问题讨论】:

    标签: android realm rx-android


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      更新后0.87.1Realm提供RxJava支持。

      realm.where(ItemModel.class).findAllAsync().asObservable()
       .observeOn(AndroidSchedulers.mainThread())
       .subscribe(new Observer < RealmResults < ItemModel >> () {
        @Override
        public void onCompleted() {
      
        }
      
        @Override
        public void onError(Throwable e) {
      
        }
      
        @Override
        public void onNext(RealmResults < ItemModel > itemModels) {
         System.out.println(itemModels.get(0).getItem());
      
        }
       });
      

      【讨论】:

      • 同样的问题,问题在于 .subscribeOn(Schedulers.IO() as sat Christian Melchior
      猜你喜欢
      • 2017-03-13
      • 1970-01-01
      • 2017-09-01
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多