1

我正在为我的项目使用 fernando cejas 的干净的 android 样板代码并为我的项目实现 firebase 实时数据库但是,当我调试我的代码时,我看到每次调用 onDataChange() 时我的发射器都被丢弃(当我添加一个新行时到我的firebase数据库),我的用户界面没有呈现新的列表内容,这是我的数据模块代码,有什么建议吗?

@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());
  }
});
}
4

1 回答 1

2

如果你调用 onComplete() 你告诉 Observable 完成它的工作。然后你订阅了——你立即完成了 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)})
}
于 2017-08-24T15:06:00.527 回答