Android 干净体系结构rxjava firebase实现
我在我的项目中使用fernando cejas的干净android样板代码,并且 在我的项目中实现firebase实时数据库,但是,当我调试代码时,每次调用onDataChange()时(当我向firebase数据库添加新行时),我都会看到我的发射器被处置,我的UI没有呈现新的列表内容,这是我的数据模块代码,有什么建议吗Android 干净体系结构rxjava firebase实现,android,rx-java2,clean-architecture,Android,Rx Java2,Clean Architecture,我在我的项目中使用fernando cejas的干净android样板代码,并且 在我的项目中实现firebase实时数据库,但是,当我调试代码时,每次调用onDataChange()时(当我向firebase数据库添加新行时),我都会看到我的发射器被处置,我的UI没有呈现新的列表内容,这是我的数据模块代码,有什么建议吗 @Override public Observable<List> signalEntityList() { Firebase myFirebaseRef = n
@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());
}
});
}
@覆盖
公共可观测信号实体列表(){
Firebase myFirebaseRef=新Firebase(“https://mydatabase.firebaseio.com/");
返回可见。创建(发射器->{
如果(isThereInternetConnection()){
myFirebaseRef.child(“信号”).addValueEventListener(新的ValueEventListener()){
@凌驾
公共无效onDataChange(数据快照快照){
列表=新的ArrayList();
Iterable snapshotIterable=snapshot.getChildren();
迭代器迭代器=snapshotIterable.Iterator();
while(iterator.hasNext()){
SignalEntity SignalEntity=iterator.next().getValue(SignalEntity.class);
列表。添加(信号实体);
}
emitter.onNext(列表);
emitter.onComplete();
}
@凌驾
已取消公共作废(FirebaseError错误){
onError(新的FirebaseException(error.getMessage());
}
});
}否则{
emitter.onError(新的NetworkConnectionException());
}
});
}
如果你被要求调用onComplete(),你被要求完成它的工作。然后你在订阅-你的线程在可观察立即完成。
试着移除它,我想你会得到你想要的结果。
顺便说一下,试着将你的列表平面映射到可观察的
@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)})
}
@覆盖
公共可观测信号实体列表(){
Firebase myFirebaseRef=新Firebase(“https://mydatabase.firebaseio.com/");
可观测obs=可观测。创建(发射器->{
如果(isThereInternetConnection()){
myFirebaseRef.child(“信号”).addValueEventListener(新的ValueEventListener()){
@凌驾
公共无效onDataChange(数据快照快照){
列表=新的ArrayList();
Iterable snapshotIterable=snapshot.getChildren();
迭代器迭代器=snapshotIterable.Iterator();
while(iterator.hasNext()){
SignalEntity SignalEntity=iterator.next().getValue(SignalEntity.class);
列表。添加(信号实体);
}
emitter.onNext(列表);
}
@凌驾
已取消公共作废(FirebaseError错误){
onError(新的FirebaseException(error.getMessage());
}
});
}否则{
emitter.onError(新的NetworkConnectionException());
}
});
返回obs.flatMap(list->{newobservable.from(list)})
}
您在数据更改时调用emmitter.onComplete
。我认为可观察到的东西在完成后就被处理了。先生,我认为这个问题已经解决了。我非常感谢你,节省了很多时间。@masp,请你写下你的评论作为回答,我会接受你的回答作为接受的回答。谢谢,不客气。看看这个。还有很多库试图将Rxjava与firebase结合起来。代码中最重要的问题是,在处理可观察对象时,您没有删除值侦听器。hello@Scrobot,我对rxjava没有太多背景知识,所以您能解释一下为什么使用flatmap以及它对我的案例的好处吗?谢谢,你好。当您使用可观察数据时,如果您想要使用的所有数据都可以表示为可观察数据,而不是可观察数据和其他类型的混合数据,则会更方便。这允许您使用一组操作符来管理数据流的整个生命周期。例如,Iterables可以被认为是一种同步的可观察的东西。这意味着,你可以使用单一的模型项,并对其应用你所需要的所有操作符。若你们想映射你们的数据——你们将映射iterable项,但若它是list——你们必须在这个映射labmda表达式中调用list foreach迭代。阅读代码并不舒服。我希望你能理解我所看到的。创造就是阻碍?控件将移动为仅在调用emitter.onNext或emitter.onError时返回?