一、问题
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()
}