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()
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值