【发布时间】:2017-07-17 04:54:03
【问题描述】:
我对 rxJava 完全陌生,这真的很令人困惑,我想先让我的应用程序离线,我决定使用 Realm 和 Retrofit,首先我想从改造中获取数据,然后从我的远程获取数据webservice 然后,使用领域的insertOrUpdate 将远程对象与本地对象合并。到目前为止,我能够完成这个过程,但是当我查看我在 stetho 上的网络请求时,这个方法已经完成了无限次请求。我哪里做错了?这是函数
public Observable<RealmResults<Event>> all() {
Realm realm = Realm.getDefaultInstance();
return realm.where(Event.class).findAllAsync()
.asObservable()
.filter(new Func1<RealmResults<Event>, Boolean>() {
@Override
public Boolean call(RealmResults<Event> events) {
return events.isLoaded();
}
})
.doOnNext(new Action1<RealmResults<Event>>() {
@Override
public void call(RealmResults<Event> events) {
service.getEvents()
.subscribeOn(Schedulers.io())
.subscribe(new Action1<List<Event>>() {
@Override
public void call(final List<Event> events) {
try(Realm realm = Realm.getDefaultInstance()) {
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.insertOrUpdate(events);
}
});
} // auto-close
}
});
}
});
}
这是我的活动中的功能,我在哪里使用它
private void getEvents() {
Log.i("EVENTSELECTION", "STARTING");
repository.all()
.subscribe(new Subscriber<List<Event>>() {
@Override
public void onCompleted() {
Log.i("EVENTSELECTION", "Task Completed");
swipeRefreshLayout.setRefreshing(false);
}
@Override
public void onError(Throwable e) {
Log.e("EVENTSELECTION", e.getMessage());
swipeRefreshLayout.setRefreshing(false);
e.printStackTrace();
}
@Override
public void onNext(List<Event> events) {
Log.i("EVENTSELECTION", String.valueOf(events.size()));
}
});
}
非常感谢。
【问题讨论】:
-
感觉
onCompleted不叫... -
我不明白你为什么用一个热的 observable 来做一个冷的 observable。你有一个数据库可以给你更改通知,你为什么忽略它?
-
@EpicPandaForce 抱歉,我是 rxjava 新手,还不了解冷热可观察对象,但我现在正在挖掘所有可能的资源,以便学习。非常感谢
-
Hot Observables 从不调用 onComplete 因为它们总是会发出事件。典型的基于侦听器的任何东西,例如单击侦听器、更改侦听器、文本更改侦听器等。在这里写
.first()就像只听第一个按钮点击、编辑文本中按下的第一个字母等等。这样做真的没有意义。
标签: java android realm retrofit