【问题标题】:Clean architecture rxjava firebase implementation干净的架构 rxjava firebase 实现
【发布时间】:2017-08-24 13:45:32
【问题描述】:

我正在为我的项目使用 fernando cejas 的干净的 android 样板代码,并且 在我的项目中实现firebase实时数据库但是,当我调试我的代码时,我看到我的发射器是 DISPOSED 每次 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());
  }
});
}

【问题讨论】:

  • 您在数据更改时致电emmitter.onComplete。我认为 observable 在完成后就被释放了。
  • 先生,我认为问题已经解决了。非常感谢你,节省了很多时间。
  • @masp ,请您写下您的评论作为答案,我会接受您的回复作为已接受的答案。谢谢。
  • 不客气。检查此question。还有很多库试图将 Rxjava 与 firebase 结合起来。您的代码最重要的问题是您在处理可观察对象时不会删除值侦听器。

标签: android rx-java2 clean-architecture


【解决方案1】:

如果你调用 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)})
}

【讨论】:

  • 你好@Scrobot,我对 rxjava 没有太多背景,所以你能解释一下为什么要使用 flatmap 及其对我的案例的好处吗?谢谢。
  • 你好。当您使用 Observables 时,如果您打算使用的所有数据都可以表示为 Observables,而不是 Observables 和其他类型的混合,那么会更方便。这允许您使用一组运算符来管理数据流的整个生命周期。例如,Iterables 可以被认为是一种同步的 Observable。
  • 这意味着,您可以使用单个模型项目并将其应用于您需要的所有运算符。如果要映射数据-您将映射可迭代项目,但如果它是列表-您必须在此映射labmda-exprassion中调用list foreach迭代。阅读您的代码不舒服。我希望你能明白我的意思)
  • Observable.create 被阻塞了?只有调用emitter.onNext 或emitter.onError,控件才会返回?
猜你喜欢
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
  • 2021-04-13
  • 2020-04-26
  • 2016-06-24
  • 2013-05-24
相关资源
最近更新 更多