
1) 【一句话结论】
MVVM通过解耦UI与业务逻辑,ViewModel封装业务逻辑并管理生命周期,使代码更易维护、测试,Activity/Fragment仅负责UI展示,ViewModel处理数据与逻辑,分离后测试更简单。
2) 【原理/概念讲解】
MVVM架构将移动应用分为三部分:View(UI组件,如Activity/Fragment)、ViewModel(业务逻辑与数据管理)、Model(数据层,如数据库、网络请求)。
ViewModel的核心作用是封装业务逻辑,处理数据变化,并通过数据绑定(如Android的LiveData、iOS的Observable)与View同步,实现UI自动更新。生命周期回调由ViewModel处理,比如Activity的onDestroy时,ViewModel能响应并清理资源(如取消网络请求、移除观察者),避免内存泄漏。
类比:ViewModel是“业务中枢”,View是“用户界面”,Model是“数据仓库”,三者通过数据绑定联动,ViewModel负责协调和逻辑处理,生命周期回调时ViewModel能主动响应,确保资源正确释放。
3) 【对比与适用场景】
| 特性 | MVC架构 | MVVM架构 |
|---|---|---|
| 定义 | View(UI)、Controller(逻辑)、Model(数据) | View(UI)、ViewModel(逻辑+数据)、Model(数据) |
| 逻辑耦合 | Controller与View强耦合 | ViewModel与View通过数据绑定解耦 |
| 测试性 | Controller逻辑难测试 | ViewModel纯逻辑,易单元测试 |
| 适用场景 | 简单应用,逻辑简单 | 复杂业务,频繁数据更新,需测试 |
| 注意点 | Controller处理UI逻辑 | ViewModel不直接操作UI |
适用场景:适用于需要频繁数据更新、复杂业务逻辑、需要单元测试的移动应用,如社交App、电商App,其中ViewModel负责用户认证、数据加载、业务规则处理。
4) 【示例】
以Android的登录ViewModel为例(伪代码):
public class LoginViewModel extends ViewModel {
private MutableLiveData<String> loginResult = new MutableLiveData<>();
private CompositeDisposable compositeDisposable;
public void login(String username, String password) {
compositeDisposable.add(
apiService.login(username, password)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(response -> {
loginResult.setValue(response.getMessage());
}, error -> {
loginResult.setValue("登录失败:" + error.getMessage());
})
);
}
public LiveData<String> getLoginResult() {
return loginResult;
}
@Override
protected void onCleared() {
super.onCleared();
if (compositeDisposable != null && !compositeDisposable.isDisposed()) {
compositeDisposable.dispose();
}
}
}
在Activity中,通过数据绑定观察ViewModel的LiveData:
<data>
<variable name="viewModel" type="com.example.app.LoginViewModel"/>
</data>
<TextView
android:text="@{viewModel.loginResult}"/>
当Activity销毁时,ViewModel的onCleared方法被调用,取消所有网络请求订阅,释放资源。
5) 【面试口播版答案】
面试官您好,MVVM架构通过将UI逻辑与业务逻辑分离,ViewModel负责处理业务逻辑和数据管理,提升代码的可维护性和可测试性。具体来说,ViewModel封装了数据操作和业务规则,与View通过数据绑定同步,当Activity/Fragment销毁时,ViewModel能响应生命周期回调(如onDestroy),清理资源(如取消网络请求、移除观察者),避免内存泄漏。举个例子,比如一个登录ViewModel,它处理用户输入的验证、网络请求,数据变化通过LiveData发布,Activity通过观察LiveData更新UI,当Activity销毁时,ViewModel的onCleared方法会取消所有订阅,释放资源,确保应用稳定运行。
6) 【追问清单】
LiveData的observeWithLifecycle),在ViewModel的onCleared方法中取消所有资源订阅。LiveData的订阅管理,在ViewModel的onCleared方法中取消所有订阅,避免内存泄漏。7) 【常见坑/雷区】
set方法,通过数据绑定更新UI。onCleared方法中清理所有资源,如网络请求、数据库连接。LiveData未正确观察。LiveData,避免内存泄漏或UI更新异常。