Observable.hide的用法

在這裏插入圖片描述

一、問題

Observable類中的hide方法有什麼用?我閱讀了該文檔,但仍然不知道它的用途,我看到很多人在使用它

Hides the identity of this Observable and its Disposable.

Allows hiding extra features such as Subject’s Observer methods or preventing certain identity-based optimizations (fusion). there are a lot of complex operations that take place internally in RxJava (like internal queue creation, worker instantiation + release, numerous atomic variables being created and modified.)

上面註釋翻譯過來爲:允許隱藏額外的功能,例如Subject的Observer方法或防止某些基於身份的優化(融合)

二、.hide的用處

如果這沒有太大意義,用一個典型的MVVM用例來看一下:

   
class LoginViewModel(
    private val loginRepository: LoginRepository
) : BaseViewModel() {
	//BehaviorSubject接受訂閱之前的最後一個消息和訂閱之後的所有消息
    private val mViewStateBehaviorSubject: BehaviorSubject<LoginViewState> =
        BehaviorSubject.createDefault(
            LoginViewState.initial()
        )
  
    fun observeViewState(): BehaviorSubject<LoginViewState> {
        return mViewStateBehaviorSubject
    }
}

LoginViewState是Activity需要cosume的東西,因此,在ViewModel中,我們將數據通過管道傳遞到Subject,然後將其暴露給Activity,如下所示:


class LoginActivity : BaseActivity() {
    private val loginViewModel: LoginViewModel by instance()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binds()
    }

    private fun binds() {
        loginViewModel.observeViewState()
            .observeOn(RxSchedulers.ui)
            .autoDispose(scropeProvider)
            .subscribe(::onNewState)

    }

}

但是暴露Subject的麻煩在於它允許活動從外部修改行爲Subject的內部狀態。這是不理想的,因爲我們只希望ViewModel控制它。

  private fun binds() {
        loginViewModel.observeViewState()
        	.onNext(badViewState()) // we want to avoid this
            .observeOn(RxSchedulers.ui)
            .autoDispose(scropeProvider)
            .subscribe(::onNewState)

  }

因此,我們不想直接公開此Subject。相反,只公開一個Observable會更有意義。

這個時候.hide()操作符就可以用了。它將一個Subject轉換爲一個Observable。

/**
 *隱藏自己的觀察者身份,純粹的作爲被觀察者,去除連續重複
 */
fun observeViewState(): Observable<LoginViewState> {
    return mViewStateBehaviorSubject.hide().distinctUntilChanged()
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章