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
)

接下来,我们创建视图(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)
        }
    }
}

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

复制代码
object RefreshIntent : WeatherIntent

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

复制代码
class WeatherViewModel : ViewModel() {


    // 状态管理
    private val _weatherState = MutableLiveData<WeatherState>()
    val weatherState: LiveData<WeatherState> = _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
    }
}

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

相关推荐
Hilaku1 小时前
我用AI重构了一段500行的屎山代码,这是我的Prompt和思考过程
前端·javascript·架构
-指短琴长-1 小时前
MySQL快速入门——内置函数
android·数据库·mysql
渡我白衣2 小时前
链接的迷雾:odr、弱符号与静态库的三国杀
android·java·开发语言·c++·人工智能·深度学习·神经网络
正经教主2 小时前
【App开发】02:Android Studio项目环境设置
android·ide·android studio
我有与与症2 小时前
从0使用Kuikly框架写一个小红书Demo-Day7
架构
拾心213 小时前
【云运维】LNMP 架构部署与应用
运维·架构
全栈软件开发3 小时前
最新版T5友价互站网源码商城PHP源码交易平台 完整带手机版源码网系统源码
android·开发语言·php
shykevin4 小时前
uni-app x开发商城系统,小程序发布,h5发布,安卓打包
android·小程序·uni-app
且白4 小时前
uniapp接入安卓端极光推送离线打包
android·uni-app
在狂风暴雨中奔跑4 小时前
使用MediaRecorder+MediaProjection高效实现Android录屏
android