在 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