Skip to content

Instantly share code, notes, and snippets.

@anitaa1990
Created December 24, 2018 05:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anitaa1990/8b2474b2053e0a9a384b76be11d0b7b0 to your computer and use it in GitHub Desktop.
Save anitaa1990/8b2474b2053e0a9a384b76be11d0b7b0 to your computer and use it in GitHub Desktop.
NetworkBoundSource.java using Observable - RxJava/RxAndroid
/* NetworkBoundSource.java using Observable */
public abstract class NetworkBoundResource<ResultType, RequestType> {
private Observable<Resource<ResultType>> result;
@MainThread
protected NetworkBoundResource() {
Observable<Resource<ResultType>> source;
if (shouldFetch()) {
source = createCall()
.subscribeOn(Schedulers.io())
.doOnNext(apiResponse -> saveCallResult(processResponse(apiResponse)))
.flatMap(apiResponse -> loadFromDb().toObservable().map(Resource::success))
.doOnError(t -> onFetchFailed())
.onErrorResumeNext(t -> {
return loadFromDb()
.toObservable()
.map(data -> Resource.error(t.getMessage(), data));
})
.observeOn(AndroidSchedulers.mainThread());
} else {
source = loadFromDb()
.toObservable()
.map(Resource::success);
}
result = Observable.concat(
loadFromDb()
.toObservable()
.map(Resource::loading)
.take(1),
source
);
}
public Observable<Resource<ResultType>> getAsObservable() {return result;}
protected void onFetchFailed() {}
@WorkerThread
protected RequestType processResponse(Resource<RequestType> response) {return response.data;}
@WorkerThread
protected abstract void saveCallResult(@NonNull RequestType item);
@MainThread
protected abstract boolean shouldFetch();
@NonNull
@MainThread
protected abstract Flowable<ResultType> loadFromDb();
@NonNull
@MainThread
protected abstract Observable<Resource<RequestType>> createCall();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment