一、問題
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()
}