Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- private val projectsReloadSubject: BehaviorSubject<Boolean> = BehaviorSubject.create()
- private lateinit var projectsObservable: Flowable<Result<List<Project>>>
- fun getProjects(): Flowable<Result<List<Project>>> {
- if (!::projectsObservable.isInitialized) {
- projectsObservable = projectsReloadSubject
- // Do an api call every time the subject receives a new value
- .flatMapSingle {
- apiManager.getProjects()
- .map { Result(it, null) }
- .onErrorReturn { Result(emptyList(), it) }
- .subscribeOn(Schedulers.io())
- }
- .toFlowable(BackpressureStrategy.LATEST)
- // Make sure both subscribers get this data
- .share()
- // Pass the data that was already loaded by the first subscriber to the second subscriber
- .replay(1)
- // Do this when 1 subscriber subscribes, and when that happens tigger the subject so that the api call gets executed
- .autoConnect(1, { projectsReloadSubject.onNext(true) })
- }
- return projectsObservable
- }
- fun triggerProjectsRefresh() {
- // Trigger the subject so that the api call gets executed
- projectsReloadSubject.onNext(true)
- }
- private fun loadProjects() {
- projectsLoadedListener?.onProjectsLoadStarted()
- val disposable = DataManager.getProjects()
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe( { result ->
- result.error?.let { onProjectsError(it) } ?: run { onProjectsLoaded(result.data) }
- }, { /* ignore */ })
- addDisposable(disposable)
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement