RealmRecylerAdapter与RxJava

时间:2016-11-25 11:13:54

标签: android realm rx-java

使用以下代码。我期待:

1。从服务器端获取所有数据。

2。将所有数据插入Realm

3。使用Realm Adapter刷新RecycleView。

第一次,数据始终为空。也许数据仍然没有准备好但仍然会调用订阅?有没有办法在数据准备好后更新视图?

ApiCall().doOnNext(response -> {
    Realm realm = Realm.getDefaultInstance();
    try {
        realm.beginTransaction();
        realm.insertOrUpdate(response);
        realm.commitTransaction();
    } finally {
        realm.close();
}
}).subscribeOn(Schedulers.io())
  .unsubscribeOn(Schedulers.computation())
  .observeOn(AndroidSchedulers.mainThread())
  .subscribe(new exObserver<List<T>>() {
      @Override
      public void onResponse(List<T> response) {
          updateView()
      }
      @Override
      public void onFailure(exException exception) {
          adapter.notifyChanged();
      }
});

3 个答案:

答案 0 :(得分:1)

RealmRecyclerViewAdapter已经使用RealmChangeListener观察提供的数据集,并在底层Realm发生更改时调用adapter.notifyDataSetChanged()

您为什么要尝试手动拨打adapter.notifyDataSetChanged()RealmRecyclerViewAdapter是专门创建的,因此您无需这样做。

答案 1 :(得分:1)

正如EpicPandaForce所提到的,当发生变化时,您无需通知RealmRecyclerViewAdapter

我的回答将专门针对您使用RxJava。

doOnNext()是一种副作用方法。 这意味着它将与您的流并行调用,而不会影响它。

当您的api通话返回时,Action1中的doOnNext()Observer中的subscribe()都将同时触发。

这意味着在Realm事务完成之前调用updateView()

如果要在插入数据库后更新视图,则必须在流中进行交易。

您可以将flatMap()用于此目的。

答案 2 :(得分:0)

你的apiCall()方法是什么?如果您不使用Retrofit,请尝试使用Observable.defer(() - &gt; apicall())。这将延迟代码评估,直到实际值到达。