Android-cleanarchitecture: Firebase implementation

Created on 28 Jul 2017  ·  3Comments  ·  Source: android10/Android-CleanArchitecture

Hello, I'm implementing firebase realtime database to my project but, I get emitter disposed everytime onDataChange() is called, and my UI is not rendering the new list content, here's my code, any suggestions ?

` @Override
public Observable> 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());
  }
});
}`

Most helpful comment

try like this:

public Observable<List<SignalEntity>> 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<>();
        for(DataSnapshot child : snapshot.getChildren()){
             list.add(child.getValue(SignalEntity.Class));
        }
        emitter.onNext(list);
      }

      @Override
      public void onCancelled(FirebaseError error) {
        emitter.onError(new FirebaseException(error.getMessage()));
      }
    });
  } else {
    emitter.onError(new NetworkConnectionException());
  }
});
}

All 3 comments

try like this:

public Observable<List<SignalEntity>> 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<>();
        for(DataSnapshot child : snapshot.getChildren()){
             list.add(child.getValue(SignalEntity.Class));
        }
        emitter.onNext(list);
      }

      @Override
      public void onCancelled(FirebaseError error) {
        emitter.onError(new FirebaseException(error.getMessage()));
      }
    });
  } else {
    emitter.onError(new NetworkConnectionException());
  }
});
}

Hello @stavelmashally ,

Actually, I figured it out now, basically I call emitter.onComplete() on onDataChange, so emitter gets disposed, and your answer is correct, thank you very much for your correct response. have a nice day.

@adnbal89 you may close the issue then.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

misrakli picture misrakli  ·  5Comments

ZherebtsovAlexandr picture ZherebtsovAlexandr  ·  3Comments

fabius-bile picture fabius-bile  ·  5Comments

StreetFlaneur picture StreetFlaneur  ·  3Comments

GediminasZukas picture GediminasZukas  ·  6Comments