☰分类导航

软件工程/第三方库与架构模式
课程进度 74% · 第9/11章第9/11章 · 标签 1/6
— 1 —

MVP 架构模式

保留MVP、MVVM、Retrofit与Hilt原例;loadFromNetwork、接口实现、资源与Gradle插件须由项目提供。MVVM是一种职责划分,不能仅凭类名ViewModel就认定符合架构;后台任务仍需生命周期与错误控制。

MVP(Model-View-Presenter)是 Android 中常用的架构模式。View 负责 UI 展示,Presenter 负责业务逻辑,Model 负责数据层。

MVP中的接口应描述界面能力,Presenter组织规则但不能永久持有失效页面。用假View记录加载、成功和失败顺序,可以脱离设备验证行为。架构的价值在边界可测试,不在于机械创建三个类或把所有网络调用都移动到Presenter。


```java
// MVP 架构实现
public interface LoginView {
    void showLoading();
    void hideLoading();
    void onLoginSuccess(String token);
    void onLoginError(String error);
}

public class LoginPresenter {
    private LoginView view;
    private LoginModel model;

    public LoginPresenter(LoginView view) {
        this.view = view;
        this.model = new LoginModel();
    }

    public void login(String username, String password) {
        view.showLoading();
        model.login(username, password, new Callback() {
            @Override
            public void onSuccess(String token) {
                view.hideLoading();
                view.onLoginSuccess(token);
            }

            @Override
            public void onError(String error) {
                view.hideLoading();
                view.onLoginError(error);
            }
        });
    }
}
```
java
1
// MVP 架构实现
2
public interface LoginView {
3
void showLoading();
4
void hideLoading();
5
void onLoginSuccess(String token);
6
void onLoginError(String error);
7
}
8
 
9
public class LoginPresenter {
10
private LoginView view;
11
private LoginModel model;
12
 
13
public LoginPresenter(LoginView view) {
14
this.view = view;
15
this.model = new LoginModel();
16
}
17
 
18
public void login(String username, String password) {
19
view.showLoading();
20
model.login(username, password, new Callback() {
21
@Override
22
public void onSuccess(String token) {
23
view.hideLoading();
24
view.onLoginSuccess(token);
25
}
26
 
27
@Override
28
public void onError(String error) {
29
view.hideLoading();
30
view.onLoginError(error);
31
}
32
});
33
}
34
}
— 2 —

MVVM 架构模式

MVVM(Model-View-ViewModel)是 Google 官方推荐的架构,结合 Jetpack 组件使用效果最佳。

ViewModel持有可恢复状态,View按状态渲染,Repository管理数据来源和同步。把Activity传进ViewModel再直接操作控件会破坏边界。先定义保存中、成功和失败的状态,再接观察机制,才能解释旋转与重复订阅后为何不重新提交。


```java
public class MyViewModel extends ViewModel {
    private MutableLiveData<String> data = new MutableLiveData<>();

    public LiveData<String> getData() {
        return data;
    }

    public void fetchData() {
        // 在后台线程加载数据
        data.setValue("加载中...");
        new Thread(() -> {
            String result = loadFromNetwork();
            data.postValue(result);
        }).start();
    }
}

// 在 Activity 中使用
MyViewModel viewModel = new ViewModelProvider(this).get(MyViewModel.class);
viewModel.getData().observe(this, text -> {
    textView.setText(text);
});
```
java
1
public class MyViewModel extends ViewModel {
2
private MutableLiveData<String> data = new MutableLiveData<>();
3
 
4
public LiveData<String> getData() {
5
return data;
6
}
7
 
8
public void fetchData() {
9
// 在后台线程加载数据
10
data.setValue("加载中...");
11
new Thread(() -> {
12
String result = loadFromNetwork();
13
data.postValue(result);
14
}).start();
15
}
16
}
17
 
18
// 在 Activity 中使用
19
MyViewModel viewModel = new ViewModelProvider(this).get(MyViewModel.class);
20
viewModel.getData().observe(this, text -> {
21
textView.setText(text);
22
});
◆

架构对比

  • MVC —— 早期 Android 模式,Activity 既当 View 又当 Controller
  • MVP —— View 与 Presenter 通过接口通信,可测试性强
  • MVVM —— ViewModel 与 LiveData/Flow 结合,自动管理生命周期
  • MVI —— Model-View-Intent,单向数据流,状态可预测