清洁架构rxjava火力点实施
我使用费尔南多cejas'清洁机器人样板代码为我的项目和 实施火力实时数据库到我的项目,但是,当我调试我的代码,我看到我的发射器是配置每次onDataChange ()被调用(当我添加一个新的行到我的firebase数据库),我的用户界面不是呈现新的列表内容,这里是我的数据模块代码,有什么建议吗?清洁架构rxjava火力点实施
@Override
public Observable<List> signalEntityList() {
Firebase myFirebaseRef = new Firebase("https://mydatabase.firebaseio.com/");
return Observable.create(emitter -> {
if (isThereInternetConnection()) {
myFirebaseRef.child("signal").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
List<SignalEntity> list = new ArrayList<>();
Iterable<DataSnapshot> snapshotIterable = snapshot.getChildren();
Iterator<DataSnapshot> iterator = snapshotIterable.iterator();
while (iterator.hasNext()) {
SignalEntity signalEntity = iterator.next().getValue(SignalEntity.class);
list.add(signalEntity);
}
emitter.onNext(list);
emitter.onComplete();
}
@Override
public void onCancelled(FirebaseError error) {
emitter.onError(new FirebaseException(error.getMessage()));
}
});
} else {
emitter.onError(new NetworkConnectionException());
}
});
}
如果你打电话onComplete()你告诉Observable完成它的工作。然后你正在订阅 - 你马上就可以观察完成。 试着去除它,我想你会得到你想要的结果。 顺便说一句,尝试将您的列表平面映射到可迭代的Observable。
@Override
public Observable<SignalEntity> signalEntityList() {
Firebase myFirebaseRef = new Firebase("https://mydatabase.firebaseio.com/");
Observable<List<SignalEntity>> obs = Observable.create(emitter -> {
if (isThereInternetConnection()) {
myFirebaseRef.child("signal").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
List<SignalEntity> list = new ArrayList<>();
Iterable<DataSnapshot> snapshotIterable = snapshot.getChildren();
Iterator<DataSnapshot> iterator = snapshotIterable.iterator();
while (iterator.hasNext()) {
SignalEntity signalEntity = iterator.next().getValue(SignalEntity.class);
list.add(signalEntity);
}
emitter.onNext(list);
}
@Override
public void onCancelled(FirebaseError error) {
emitter.onError(new FirebaseException(error.getMessage()));
}
});
} else {
emitter.onError(new NetworkConnectionException());
}
});
return obs.flatMap(list -> {new Observable.from(list)})
}
hello @Scrobot,我没有太多的rxjava背景,那么你能解释一下为什么要使用flatmap及其对我的情况的好处吗?谢谢。 –
你好。当您使用Observable时,如果您要处理的所有数据都可以表示为Observable,而不是Observable和其他类型的混合,则可能会更方便。这使您可以使用一组操作员来管理数据流的整个生命周期。例如,可疑事件可以被认为是一种同步的Observable。 – Scrobot
这意味着,您可以使用单个模型项目并将其应用到您需要的所有操作员。如果你想映射你的数据 - 你将映射可迭代的项目,但如果它是列表 - 你必须调用这张map labmda-exprassion中的foreach迭代列表。阅读你的代码并不舒服。我希望你会明白我的意思) – Scrobot
您在数据更改时调用'emmitter.onComplete'。我认为可观察项目在完成时即被处置。 – masp
比你先生,我觉得问题解决了。我不能够感谢你,节省了很多时间。 –
@masp,请您将您的评论作为答案写下,我会接受您的答复作为接受的答案。谢谢。 –