如何使用Realm asObservable和RxJava的concat()运算符?

时间:2015-12-23 14:54:55

标签: android realm rx-java

我尝试使用Realm与RxJava和Retrofit以一种方式DanLew描述here汇总来自领域和改造的输入但是如果我将领域添加到链中它会被卡住

Observable.concat(countryStorage.restoreAsObservable(),
              networkService.api()
                  .getCountries()
                  .doOnNext(countryStorage::save))
              .first()
              .observeOn(AndroidSchedulers.mainThread())
              .subscribe(//never reaching here)

存储

 @Override public Observable<List<Country>> restoreAsObservable() {
        Realm realm = realmProvider.get();
        return realm.where(Country.class)
            .findAll()
            .asObservable()
            .map(countries -> return realm.copyFromRealm(countries))
            .first(countries -> return !countries.isEmpty())
            .doOnCompleted(realm::close());
      }

似乎可能会发生这种情况,即Realm中的observable很热,但在文档中没有任何关于它的内容以及我如何将Realm与其他可观察对象组合在一起?

更新 它变成了旧的方式它工作得很好。关于新api的问题仍然存在。

return Observable.just(
        realm.copyFromRealm(realm.where(Country.class).findAll()))
        .filter(countries -> !countries.isEmpty())
        .doOnCompleted(realm::close);

1 个答案:

答案 0 :(得分:0)

这种情况正在发生,因为countryStorage.restoreAsObservable()永远不会完成,如果您阅读concat doc,它会明确说明:

  

Concat等待订阅您传递给它的每个其他Observable,直到上一个Observable完成。

相反,您可以执行以下操作:

    countryStorage.restoreAsObservable()
          .doOnSubscribe(() -> {
              networkService.api()
                  .getCountries()
                  .subscribe(countryStorage::save)
          })
          .observeOn(AndroidSchedulers.mainThread())
          .subscribe(//do smth)