Advertisement
Guest User

Untitled

a guest
Jun 17th, 2019
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.86 KB | None | 0 0
  1. private val projectsReloadSubject: BehaviorSubject<Boolean> = BehaviorSubject.create()
  2. private lateinit var projectsObservable: Flowable<Result<List<Project>>>
  3.  
  4. fun getProjects(): Flowable<Result<List<Project>>> {
  5. if (!::projectsObservable.isInitialized) {
  6. projectsObservable = projectsReloadSubject
  7. // Do an api call every time the subject receives a new value
  8. .flatMapSingle {
  9. apiManager.getProjects()
  10. .map { Result(it, null) }
  11. .onErrorReturn { Result(emptyList(), it) }
  12. .subscribeOn(Schedulers.io())
  13. }
  14. .toFlowable(BackpressureStrategy.LATEST)
  15. // Make sure both subscribers get this data
  16. .share()
  17. // Pass the data that was already loaded by the first subscriber to the second subscriber
  18. .replay(1)
  19. // Do this when 1 subscriber subscribes, and when that happens tigger the subject so that the api call gets executed
  20. .autoConnect(1, { projectsReloadSubject.onNext(true) })
  21. }
  22.  
  23. return projectsObservable
  24. }
  25.  
  26. fun triggerProjectsRefresh() {
  27. // Trigger the subject so that the api call gets executed
  28. projectsReloadSubject.onNext(true)
  29. }
  30.  
  31. private fun loadProjects() {
  32. projectsLoadedListener?.onProjectsLoadStarted()
  33.  
  34. val disposable = DataManager.getProjects()
  35. .subscribeOn(Schedulers.io())
  36. .observeOn(AndroidSchedulers.mainThread())
  37. .subscribe( { result ->
  38. result.error?.let { onProjectsError(it) } ?: run { onProjectsLoaded(result.data) }
  39. }, { /* ignore */ })
  40.  
  41. addDisposable(disposable)
  42. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement