Created
December 24, 2018 05:57
-
-
Save anitaa1990/8b2474b2053e0a9a384b76be11d0b7b0 to your computer and use it in GitHub Desktop.
NetworkBoundSource.java using Observable - RxJava/RxAndroid
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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