Skip to content

Instantly share code, notes, and snippets.

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