My Scenario is very similar to this Image:
Flow of the app will be like this:
RxAndroid
to fetch the data from cache / local file.Retrofit
and RxJava
to update the view again with new data coming from the web services.So, I am updating the view twice(One from local file and just after that through webservices)
How can I achieve the result using RxJava
and RxAndroid
? What I was thinking is
onNext
method of observable1
I can create another observable2
.observable2.onNext()
I can update the local file.
Now How will I update the view
with the updated data (loaded in the file)?What would be the good approach?
I wrote a blog post about exactly this same scenario. I used the merge operator (as suggested by sockeqwe) to address your points '2' and '4' in parallel, and doOnNext to address '5':
// NetworkRepository.java
public Observable<Data> getData() {
// implementation
}
// DiskRepository.java
public Observable<Data> getData() {
// implementation
}
// DiskRepository.java
public void saveData(Data data) {
// implementation
}
// DomainService.java
public Observable<Data> getMergedData() {
return Observable.merge(
diskRepository.getData().subscribeOn(Schedulers.io()),
networkRepository.getData()
.doOnNext(new Action1<Data>() {
@Override
public void call(Data data) {
diskRepository.saveData(data); // <-- save to cache
}
}).subscribeOn(Schedulers.io())
);
}
In my blog post I additionally used filter and Timestamp to skip updating the UI if the data is the same or if cache is empty (you didn't specify this but you will likely run into this issue as well).
Link to the post: https://medium.com/@murki/chaining-multiple-sources-with-rxjava-20eb6850e5d9