Rx java 使用RxJava在不同线程上进行领域、网络操作、订阅和观察

Rx java 使用RxJava在不同线程上进行领域、网络操作、订阅和观察,rx-java,realm-list,realm,Rx Java,Realm List,Realm,我需要: 从后台线程上的API获取一些数据 在UI上显示数据 保存到领域 fetchItemsFromServer().subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<ItemList>() { @Override public void call(ItemList items) { displ

我需要:

  • 从后台线程上的API获取一些数据
  • 在UI上显示数据
  • 保存到领域

    fetchItemsFromServer().subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<ItemList>() {
        @Override
        public void call(ItemList items) {
    
            displayItems(items);
    
            try {
                realm.beginTransaction();
                realm.copyToRealmOrUpdate(itemList);
                realm.commitTransaction();
                Logger.v("Realm ", "Copied list object to realm");
            } catch (Exception e) {
                Logger.e("Realm Something went wrong ", e);
                realm.cancelTransaction();
            }
    
        }
    }
    

    我不会在UI线程上保存数据,而是在后台使用以下模式:

    fetchItemsFromServer()
        .doOnNext(new Action1<ItemList>() {
            @Override
            public ItemList call(ItemList list) {
                // Save data on the background thread
                Realm realm = Realm.getDefaultInstance();
                realm.beginTransaction();
                realm.copyToRealmOrUpdate(list);
                realm.commitTransaction();
                realm.close();
            }
        })
      .subscribeOn(Schedulers.io())
      .observeOn(AndroidSchedulers.mainThread())
      .subscribe(new Action1<ItemList>() {
        @Override
        public void call(ItemList items) {
            displayItems(items);
        }
    }
    
    fetchItemsFromServer()
    .doOnNext(新行动1){
    @凌驾
    公共项目列表调用(项目列表){
    //在后台线程上保存数据
    Realm Realm=Realm.getDefaultInstance();
    realm.beginTransaction();
    realm.copyToRealmOrUpdate(列表);
    realm.commitTransaction();
    realm.close();
    }
    })
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .订阅(新操作1(){
    @凌驾
    公共作废调用(项目列表项目){
    显示项目(项目);
    }
    }
    
    我不会在UI线程上保存数据,而是在后台使用以下模式:

    fetchItemsFromServer()
        .doOnNext(new Action1<ItemList>() {
            @Override
            public ItemList call(ItemList list) {
                // Save data on the background thread
                Realm realm = Realm.getDefaultInstance();
                realm.beginTransaction();
                realm.copyToRealmOrUpdate(list);
                realm.commitTransaction();
                realm.close();
            }
        })
      .subscribeOn(Schedulers.io())
      .observeOn(AndroidSchedulers.mainThread())
      .subscribe(new Action1<ItemList>() {
        @Override
        public void call(ItemList items) {
            displayItems(items);
        }
    }
    
    fetchItemsFromServer()
    .doOnNext(新行动1){
    @凌驾
    公共项目列表调用(项目列表){
    //在后台线程上保存数据
    Realm Realm=Realm.getDefaultInstance();
    realm.beginTransaction();
    realm.copyToRealmOrUpdate(列表);
    realm.commitTransaction();
    realm.close();
    }
    })
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .订阅(新操作1(){
    @凌驾
    公共作废调用(项目列表项目){
    显示项目(项目);
    }
    }
    
    您从订阅服务器的何处获取领域实例?订阅服务器正在UI线程上执行保存操作,因此,如果您的领域实例也是在那里创建的,那么它应该可以工作。@ChristianMelchior我的领域是通过依赖项注入来注入的。一旦我删除订阅服务器(Schedulers.io())对于API调用,一切正常。删除
    subscribeOn(Schedulers.io())
    应该不会对您的订阅服务器产生影响,因为您的
    observeOn
    是主线程。您的
    fetchItemsFromServer()吗
    以某种方式使用Realm?@ChristianMelchior no它调用一个请求,该请求将项目作为Json返回,使用Gson解析为Realm对象,itemlist然后我的最佳想法是Dagger以某种方式从另一个线程为您提供缓存版本。请注意,如果您按照示例中的方式配置您的Realm,那么您可以使用
    set来避免Dagger默认配置
    应用程序中
    类并使用
    Realm.getDefaultInstance()
    创建实例。您从订阅服务器中的何处获取领域实例?订阅服务器正在UI线程上执行保存操作,因此,如果您的领域实例也是在那里创建的,那么它应该可以工作。@ChristianMelchior我的领域是通过依赖项注入来注入的。一旦我删除订阅服务器(Schedulers.io())对于API调用,一切正常。删除
    subscribeOn(Schedulers.io())
    应该不会对您的订阅服务器产生影响,因为您的
    observeOn
    是主线程。您的
    fetchItemsFromServer()吗
    以某种方式使用Realm?@ChristianMelchior no它调用一个请求,该请求将项目作为Json返回,使用Gson解析为Realm对象,itemlist然后我的最佳想法是Dagger以某种方式从另一个线程为您提供缓存版本。请注意,如果您按照示例中的方式配置您的Realm,那么您可以使用
    set来避免Dagger默认配置
    应用程序中
    类并使用
    Realm.getDefaultInstance()
    创建实例。这意味着您可能从其他地方获取异常。此代码段保证仅在1个线程上使用域实例。我花了更多时间研究此问题,您是对的。我从其他地方获取异常,从UI访问域。这意味着您可能y从其他地方获取异常。此代码段保证仅在1个线程上使用域实例。我花了更多时间研究此问题,你是对的。我从其他地方获取异常,从UI访问域。