Search code examples
androidrx-javaandroid-roomrx-android

iterate list android room with rxjava one by one


I have list that I'm getting from room db and I want to get that list item one by one with rxjava. When I add consumer and flowable then it giving only first index so add it in single. It's working for me but I want to know that it is the right way to fetch or not please let me know that.

@Query("SELECT * FROM ContactDao")
Single<list<contactdao>> getAllContacts();

my activity class function -->

Utility.initDatabase().dbHelper().getAllContacts()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SingleObserver<list<contactdao>>() {
@Override
public void onSubscribe(Disposable d) {
compositeDisposable.add(d);
}

@Override
public void onSuccess(List<contactdao> contactDaos) {
Log.e(TAG, "onSuccess: " + contactDaos.size());

Observable.fromIterable(contactDaos)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<contactdao>() {
@Override
public void onSubscribe(Disposable d) {
compositeDisposable.add(d);
}

@Override
public void onNext(ContactDao contactDao) {
Log.e(TAG, "onNext: " + contactDao + firstName);
}

@Override
public void onError(Throwable e) {

}

@Override
public void onComplete() {

}
});

}

@Override
public void onError(Throwable e) {
e.printStackTrace();
}
});

Solution

  • Instead of creating a new chain in the callback of the observer, you can chain the call to the database with the iteration and have a single chain:

    Utility.initDatabase().dbHelper().getAllContacts()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .flatMapObservable(contactDaos -> Observable.fromIterable(contactDaos))
    .subscribe(new Observer<contactdao>() {
    @Override
    public void onSubscribe(Disposable d) {
    compositeDisposable.add(d);
    }
    
    @Override
    public void onNext(ContactDao contactDao) {
    Log.e(TAG, "onNext: " + contactDao + firstName);
    }
    
    @Override
    public void onError(Throwable e) {
    
    }
    
    @Override
    public void onComplete() {
    
    }
    });