在Schedulers.io()上观察Observable时,Realm访问错误的线程

时间:2015-09-26 09:38:14

标签: 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();
        });
    }

2 个答案:

答案 0 :(得分:3)

这是因为您要将.subscribeOn(Schedulers.IO()observeOn(AndroidSchedulers.mainThread())合并。

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

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

答案 1 :(得分:-1)

更新0.87.1后,Realm会提供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());

  }
 });