lundi 7 novembre 2016

RxJava pattern for returning cold results, doingmore work, then returning hot results

I'm learning RxJava so please be gentle. I've watched the tutorials, done the reading, searched SO, however, I'm still having some problems transforming my AsyncTaskLoader. For some reason, I can't find a pattern of operators to achieve my task (although I think it's a common one). What I'm trying to do is the following: return an Observable my fragment could subscribe to. The observable should do the following on subscribe:

1) Fetch data from the local database by doing 2 queries, running some logic and returning results;
2) Fetching data from API;
3) Synchronising the new API data with the database;
4) Repeating step one and returning results;

So far I've transformed my db calls and my API calls to return observables. I'm trying to understand how I can emit the cold results and continue with the chain. I could probably keep the two operations separately, and use the same subscriber to subscribe to both? But I'm not sure how that would work if my new loader-replacement class returns an observable... Also I don't really need to process the results from the second observable - I just need for the first one to replay when the second one finished.

So far I have the following:

 public Observable<StuffFetchResult> getColdStuff() {
    return Observable.zip(mDataSource.listStuff(), mDataSource.listOtherStuff(),
            (stuff, moreStuff) -> {
                List<Stuff> mergedList = new ArrayList<>();
                // do some merging stuff
                return new StuffFetchResult(mergedList);
            }).subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread());
 } 

Assume I also have getHotStuff() that will do the API call and the synchronisation with the database, if that's the right approach, and return the same Observable. However, I'm stuck on the next step - how can I restart the first observable to replay once hotStuff has completed, without adding another subscriber?

Aucun commentaire:

Enregistrer un commentaire