Guest User

Untitled

a guest
May 22nd, 2018
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.20 KB | None | 0 0
  1. import android.arch.lifecycle.ViewModel
  2. import android.os.Looper
  3. import android.support.annotation.CallSuper
  4. import com.google.errorprone.annotations.CheckReturnValue
  5. import com.uber.autodispose.CompletableSubscribeProxy
  6. import com.uber.autodispose.FlowableSubscribeProxy
  7. import com.uber.autodispose.LifecycleNotStartedException
  8. import com.uber.autodispose.MaybeSubscribeProxy
  9. import com.uber.autodispose.ObservableSubscribeProxy
  10. import com.uber.autodispose.ScopeProvider
  11. import com.uber.autodispose.SingleSubscribeProxy
  12. import io.reactivex.Completable
  13. import io.reactivex.Flowable
  14. import io.reactivex.Maybe
  15. import io.reactivex.MaybeObserver
  16. import io.reactivex.Observable
  17. import io.reactivex.Single
  18. import io.reactivex.android.MainThreadDisposable
  19. import java.util.concurrent.TimeUnit
  20. import com.uber.autodispose.kotlin.autoDisposable
  21.  
  22. class MyViewModel : BaseViewModel() {
  23. init {
  24. Observable.interval(10, TimeUnit.SECONDS)
  25. .autoDisposable()
  26. .subscribe {
  27. // do something
  28. }
  29. }
  30. }
  31.  
  32. abstract class BaseViewModel : ViewModel() {
  33. protected val autoDisposeViewModelDelegate by lazy { AutoDisposeViewModelDelegate() }
  34. protected val scopeProvider by lazy { AutoDisposeViewModelScopeProvider(autoDisposeViewModelDelegate) }
  35.  
  36. @CallSuper
  37. override fun onCleared() {
  38. super.onCleared()
  39.  
  40. autoDisposeViewModelDelegate.onCleared()
  41. }
  42.  
  43. // I like to use these extensions to simplify the calls, but they don't really save that much
  44. @CheckReturnValue
  45. protected fun <T> Observable<T>.autoDisposable(): ObservableSubscribeProxy<T> =
  46. autoDisposable(scopeProvider)
  47.  
  48. @CheckReturnValue
  49. protected fun <T> Flowable<T>.autoDisposable(): FlowableSubscribeProxy<T> =
  50. this.autoDisposable(scopeProvider)
  51.  
  52. @CheckReturnValue
  53. protected fun <T> Maybe<T>.autoDisposable(): MaybeSubscribeProxy<T> =
  54. this.autoDisposable(scopeProvider)
  55.  
  56. @CheckReturnValue
  57. protected fun Completable.autoDisposable(): CompletableSubscribeProxy =
  58. this.autoDisposable(scopeProvider)
  59.  
  60. @CheckReturnValue
  61. protected fun <T> Single<T>.autoDisposable(): SingleSubscribeProxy<T> =
  62. this.autoDisposable(scopeProvider)
  63. }
  64.  
  65. /** keep all the autodispose stuff in a simple delegate making it easier to compose into existing ViewModel hierarchies */
  66. class AutoDisposeViewModelDelegate {
  67. private val clearListeners: MutableList<OnClearListener> = mutableListOf()
  68. private var cleared = false
  69.  
  70. fun onCleared() {
  71. cleared = true
  72.  
  73. clearListeners.forEach {
  74. it.onClear()
  75. }
  76. clearListeners.clear()
  77. }
  78.  
  79. private interface OnClearListener {
  80. fun onClear()
  81. }
  82.  
  83. /** adapted/borrowed liberally from viewdetachedmaybe */
  84. internal class ClearedEventMaybe(private val delegate: AutoDisposeViewModelDelegate) : Maybe<Unit>() {
  85. override fun subscribeActual(observer: MaybeObserver<in Unit>) {
  86. val listener = Listener(delegate, observer)
  87. observer.onSubscribe(listener)
  88.  
  89. // Check we're on the main thread.
  90. if (Looper.myLooper() != Looper.getMainLooper()) {
  91. observer.onError(IllegalStateException("ViewModels can only be bound to on the main thread!"))
  92. return
  93. }
  94.  
  95. // Check that it's not cleared.
  96. if (delegate.cleared) {
  97. observer.onError(LifecycleNotStartedException("ViewModel is cleared!"))
  98. return
  99. }
  100.  
  101. if(!listener.isDisposed) {
  102. delegate.clearListeners += listener
  103. }
  104. }
  105. }
  106.  
  107. internal class Listener(private val delegate: AutoDisposeViewModelDelegate, private val observer: MaybeObserver<in Unit>) :
  108. MainThreadDisposable(),
  109. OnClearListener {
  110. override fun onClear() {
  111. if (!isDisposed) {
  112. observer.onSuccess(Unit)
  113. }
  114. }
  115.  
  116. override fun onDispose() {
  117. delegate.clearListeners -= this
  118. }
  119. }
  120. }
  121.  
  122. class AutoDisposeViewModelScopeProvider(private val delegate: AutoDisposeViewModelDelegate) : ScopeProvider {
  123. override fun requestScope(): Maybe<*> {
  124. return AutoDisposeViewModelDelegate.ClearedEventMaybe(delegate)
  125. }
  126. }
Add Comment
Please, Sign In to add comment