使用以下代码。我期待:
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();
}
});
答案 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())。这将延迟代码评估,直到实际值到达。