Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 干净体系结构rxjava firebase实现_Android_Rx Java2_Clean Architecture - Fatal编程技术网

Android 干净体系结构rxjava firebase实现

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

我在我的项目中使用fernando cejas的干净android样板代码,并且 在我的项目中实现firebase实时数据库,但是,当我调试代码时,每次调用onDataChange()时(当我向firebase数据库添加新行时),我都会看到我的发射器被处置,我的UI没有呈现新的列表内容,这是我的数据模块代码,有什么建议吗

@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时返回?