在 MVI 架构中,UI 的状态是通过中间状态流(Observable)的变化来更新的。然而,在实际应用中,由于大量的状态更新可能会导致性能问题,因此需要考虑优化这一点。
一个常见的问题是,当 UI 中的某个状态变化时,所有的状态都会被重新赋值,而不是仅仅将变化的状态更新。这种情况下,UI 已经存在的状态会被更新,即使这些状态在变化时并不需要更新。这会导致性能问题。
以下是一个解决方法,使用 Kotlin 语言实现:
在 ViewModel 中,保存一个 UI 状态类(UI State Class),它包含了所有的 UI 状态,以及每个状态的变化。如果一个状态没有变化,它将保持不变。
data class UIState(val loading: Boolean = false, val title: String = "", val message: String = "", val data: List = emptyList())
sealed class UIEvent {
data class DataLoaded(val data: List) : UIEvent()
data class Loading(val isLoading: Boolean) : UIEvent()
}
class MyViewModel : ViewModel() {
private val compositeDisposable = CompositeDisposable()
private val uiState: MutableLiveData = MutableLiveData(UIState())
val uiStateLiveData: LiveData
get() = uiState
fun getSomeData() {
val disposable = dataRepository.getData()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ data ->
val newState = uiState.value?.copy(data = data, loading = false)
uiState.postValue(newState)
},
{ throwable ->
val newState = uiState.value?.copy(loading = false, message = throwable.message ?: "")
uiState.postValue(newState)
}
)
compositeDisposable.add(disposable)
uiState.postValue(uiState.value?.copy(loading = true))
}
override fun onCleared() {
super.onCleared()
compositeDisposable.dispose