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()
}
------ 本文结束 ------
坚持原创技术分享,您的支持将鼓励我继续创作!