MVVM在Android开发中的应用

MVVM在Android开发中的应用

做Android开发时,很多人一开始都是直接在Activity里写逻辑、更新界面、处理数据,时间一长代码越来越乱,改个按钮颜色都得翻半天。后来大家开始寻找更清晰的结构,MVVM就是其中用得越来越多的一种模式。

MVVM全称是Model-View-ViewModel,它把界面(View)和业务逻辑(ViewModel)分开,让代码更清楚,也更容易测试和维护。比如你做一个天气App,主界面显示温度、城市名、天气图标,这些属于View;而从网络获取天气数据、解析JSON、判断是否需要刷新,则由ViewModel来负责。

View负责展示

在Android中,Activity或Fragment就是View的角色。它不关心数据从哪来,只管监听ViewModel的变化并更新界面。比如:

TextView tempView = findViewById(R.id.temperature);
viewModel.getTemperature().observe(this, temp -> {
tempView.setText(temp + "℃");
});

这段代码的意思是:当ViewModel里的温度数据变了,界面自动跟着变,不用手动去查什么时候该刷新。

ViewModel管理数据

ViewModel的作用是准备数据,并暴露给View使用。它不会持有Activity的引用,所以不用担心内存泄漏。比如你旋转手机屏幕,Activity重建了,但ViewModel还能保留之前的数据,不用重新请求网络。

public class WeatherViewModel extends ViewModel {
private MutableLiveData<String> temperature = new MutableLiveData<>();

public LiveData<String> getTemperature() {
return temperature;
}

public void fetchWeather(String city) {
// 模拟网络请求
temperature.setValue("26");
}
}

这样写完后,View只需要调用fetchWeather,等数据回来自然会显示。

Model处理数据来源

Model层负责真正和数据打交道,比如访问网络、读写数据库。你可以用Retrofit发请求,用Room存本地数据。ViewModel调用Model的方法,拿到结果后通知View更新。

举个例子,点“刷新”按钮时,ViewModel通知Model去拉最新天气,等数据回来再塞给LiveData,界面就自动刷新了。整个过程各司其职,改网络逻辑不影响界面,换UI也不用动数据层。

为什么用MVVM

以前用MVC或MVP,经常出现Activity臃肿、测试困难的问题。MVVM配合Data Binding还能进一步减少findViewById这类重复代码。而且ViewModel+LiveData的设计天生支持响应式编程,适合现在复杂的交互场景。

比如你在地铁里刷App,网络断了又恢复,MVVM能帮你优雅地处理这种状态变化,而不是一堆if-else判断。

现在很多新项目都默认用MVVM,Google也在Jetpack里提供了ViewModel、LiveData、Data Binding等支持,开箱即用。学明白这套模式,写起App来思路更清,团队协作也更顺畅。