• Android MVI架构的深入解析与对比


    什么是MVI?

    M:model,此处的model并不是传统的数据模块,它是指用来存储视图状态UI State的一个模块 。比如请求数据时的loading、请求失败的提示页面等UI层面的变化状态。

    V:view,视图模块

    I:intent,此处的intent并非是我们页面跳转的intent,而是取起实际意思:意图、目的。用来响应用户在操作屏幕时的动作,用户的意图和目的。比如点击保存按钮或者下拉刷新数据等。

    MVI、MVVM和MVP架构的对比

    MVI、MVVM和MVP都是常见的Android架构模式,各自有其优点和适用场景。

    MVI -VS- MVVM:

    MVI的数据流是单向的,状态变化由模型(Model)驱动,确保了状态的一致性和可预测性。

    MVVM中的双向数据绑定可以简化视图(View)和模型(Model)之间的数据交互,但也可能导致状态管理的混乱。

    MVI -VS- MVP:

    MVI通过响应式数据流实现了对状态变化的高效处理,相比之下,MVP中的视图(View)和模型(Model)之间的交互相对复杂。

    MVI的单向数据流使得测试模型(Model)的行为更加容易,而MVP中的视图(View)和模型(Model)之间的耦合可能导致测试困难。

    MVI架构实战讲解和代码示例

    为了更好地理解MVI架构,让我们通过一个例子进行实战演示。我们将创建一个天气预报应用,展示当前天气和未来几天的天气预报信息。

    在代码示例中,我们会用到以下库:

    RxJava:用于处理响应式数据流。

    LiveData:用于将数据流连接到视图。

    首先,我们定义模型(Model)的状态(State)类,包含天气预报的相关信息,例如温度、湿度和天气状况等。

    
    
    data class WeatherState(
        val temperature: Float,
        val humidity: Float,
        val condition: String
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    接下来,我们创建视图(View)界面,展示天气信息,并提供一个按钮用于刷新数据。

    class WeatherActivity : AppCompatActivity() {
    
    
        // 初始化ViewModel
        private val viewModel: WeatherViewModel by viewModels()
    
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_weather)
    
    
            // 监听状态变化,更新UI
            viewModel.weatherState.observe(this, Observer { state ->
                // 更新温度、湿度和天气状况的显示
                temperatureTextView.text = state.temperature.toString()
                humidityTextView.text = state.humidity.toString()
                conditionTextView.text = state.condition
            })
    
    
            // 刷新按钮点击事件
            refreshButton.setOnClickListener {
                // 发送刷新数据的意图
                viewModel.processIntent(RefreshIntent)
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    然后,我们创建意图(Intent)类,代表用户操作的动作。在这个例子中,我们只有一个刷新数据的意图。

    object RefreshIntent : WeatherIntent
    
    • 1

    接下来,我们实现模型(Model)部分,包括状态管理和数据流的处理。

    class WeatherViewModel : ViewModel() {
    
    
        // 状态管理
        private val _weatherState = MutableLiveData()
        val weatherState: LiveData = _weatherState
    
    
        // 处理意图
        fun processIntent(intent: WeatherIntent) {
            when (intent) {
                RefreshIntent -> fetchWeatherData()
            }
        }
    
    
        // 获取天气数据
        private fun fetchWeatherData() {
            // 发起网络请求或其他数据获取逻辑
            // 更新状态
            val weatherData = // 获取的天气数据
            val newState = WeatherState(
                temperature = weatherData.temperature,
                humidity = weatherData.humidity,
                condition = weatherData.condition
            )
            _weatherState.value = newState
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    本文讲解了在Android开发中的MVI架构的简单解析理解,以及对比MVVM和MVP架构;更多有关Android程序员的架构技术进阶,可以参考《Android架构核心技术手册》点击可以查看详细类目详情。

  • 相关阅读:
    数字逻辑设计(6)
    List 模拟实现
    Shell 数组遍历的3种方法
    Codeforces Round 908 (Div. 2)题解
    Opencv4.4+Opencv_contrib vs2017 win10编译
    mysql数据库安装
    DWR框架--让前端JS代码调用JAVA后端的方法
    Launcher插件显示被截断
    【BAT-表姐御用03MD(ren)命令】文件夹批量创建/命名/改名
    软件测试开发基础|测开中的几个工具开发实战
  • 原文地址:https://blog.csdn.net/2301_76813281/article/details/134207555