news 2026/4/3 3:02:31

【大前端】【Android】把 Activity 重构成 MVVM 的对比示例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【大前端】【Android】把 Activity 重构成 MVVM 的对比示例

同一个功能:加载用户并显示名字

功能不变:

点按钮 → 请求用户 → 显示用户名 → 失败提示


一、❌ 传统 Activity 写法(所有东西都在 Activity)

Activity(UI类)

public class UserActivity extends AppCompatActivity { TextView tvName; Button btnLoad; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_user); tvName = findViewById(R.id.tvName); btnLoad = findViewById(R.id.btnLoad); btnLoad.setOnClickListener(v -> { // ① UI 事件 loadUser(); }); } private void loadUser() { // ② 业务逻辑 showLoading(); Api.getUser(new Callback<User>() { @Override public void onSuccess(User user) { // ③ 数据处理 tvName.setText(user.getName()); // 改 UI hideLoading(); } @Override public void onError(String msg) { // ④ 错误处理 Toast.makeText(UserActivity.this, msg, Toast.LENGTH_SHORT).show(); hideLoading(); } }); } }

❗问题在哪?

问题原因
Activity 很胖所有职责都在
不可测试依赖 Android
UI & 逻辑耦合直接操作 View
状态不可控loading / error 到处写

二、✅ 重构目标(先不看代码)

我们要做到:

Activity:我只管展示 ViewModel:我管逻辑和状态

Activity不再知道

  • 请求怎么发

  • 什么时候成功 / 失败

  • 状态怎么切换


三、✅ MVVM 写法(拆开)


1️⃣ ViewModel:专门“管状态”

public class UserViewModel extends ViewModel { // 用户名状态 private MutableLiveData<String> userName = new MutableLiveData<>(); // loading 状态 private MutableLiveData<Boolean> loading = new MutableLiveData<>(); // 错误信息 private MutableLiveData<String> errorMsg = new MutableLiveData<>(); public LiveData<String> getUserName() { return userName; } public LiveData<Boolean> getLoading() { return loading; } public LiveData<String> getErrorMsg() { return errorMsg; } public void loadUser() { loading.setValue(true); Api.getUser(new Callback<User>() { @Override public void onSuccess(User user) { userName.setValue(user.getName()); // 只改数据 loading.setValue(false); } @Override public void onError(String msg) { errorMsg.setValue(msg); // 只抛状态 loading.setValue(false); } }); } }

📌注意一个关键点

ViewModel从头到尾没有一句 UI 代码


2️⃣ Activity:变成“数据监听器”

public class UserActivity extends AppCompatActivity { private UserViewModel viewModel; private TextView tvName; private ProgressBar progressBar; private Button btnLoad; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_user); tvName = findViewById(R.id.tvName); progressBar = findViewById(R.id.progressBar); btnLoad = findViewById(R.id.btnLoad); viewModel = new ViewModelProvider(this).get(UserViewModel.class); // ① 监听数据 viewModel.getUserName().observe(this, name -> { tvName.setText(name); }); viewModel.getLoading().observe(this, show -> { progressBar.setVisibility(show ? View.VISIBLE : View.GONE); }); viewModel.getErrorMsg().observe(this, msg -> { if (msg != null) { Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); } }); // ② 把点击事件“交出去” btnLoad.setOnClickListener(v -> { viewModel.loadUser(); }); } }

四、最重要的一行对比(🔥核心)

以前

tvName.setText(user.getName());

现在

userName.setValue(user.getName());

👉UI 更新从“命令式”变成“数据驱动”


五、用一句话理解“重构发生了什么”

Activity 不再“做事”
ViewModel 不再“碰 UI”
它们通过“状态”交流


六、责任变化对照表(一定要看)

职责以前现在
点击处理ActivityActivity(转交)
网络请求ActivityViewModel
成功失败判断ActivityViewModel
UI 更新ActivityActivity
状态来源ActivityViewModel

七、已经“半只脚进 MVVM 了”的标志

如果现在能理解这句话:

Activity 不知道“什么时候该改 UI”,
它只知道“数据变了我就展示”

那已经抓住MVVM 的核心原理了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/29 5:47:02

实习面试题-游戏服务端开发面试题

1.什么是游戏服务端?它在整个游戏架构中的角色是什么? 回答重点 游戏服务端是支撑在线多人游戏正常运行的后台服务器。它负责处理游戏中的逻辑、管理玩家数据、维护游戏状态、同步玩家之间的互动以及实现游戏所需的各种功能。在整个游戏架构中,游戏服务端是核心部分,它确…

作者头像 李华
网站建设 2026/4/2 1:26:51

Fastapi的单进程响应问题 和 解决方法

现象第1步&#xff1a;创建 FastAPI 服务器 (main.py)我们将创建一个 FastAPI 应用&#xff0c;包含三个接口&#xff1a;/fast: 一个立即返回的接口&#xff0c;用来测试服务器是否“活着”。/slow-sync: 一个使用 time.sleep() 模拟同步阻塞操作的接口。这是问题的关键。/slo…

作者头像 李华
网站建设 2026/4/1 16:41:24

实习面试题-Shell 面试题

1.如何在 Shell 脚本中实现字符串的截取和拼接? 回答重点 在 Shell 脚本中,实现字符串的截取和拼接可以通过内置的字符串操作方式来完成。具体来说,截取和拼接都是通过特定的语法来操作变量。 1)字符串截取: 通过 ${var:offset:length} 这种形式可以截取字符串。 例如:…

作者头像 李华
网站建设 2026/3/31 15:09:12

14、UNIX 文件系统与磁盘管理指南

UNIX 文件系统与磁盘管理指南 1. 引言 在 UNIX 环境中,文件系统和磁盘管理是系统管理的核心任务。这些任务看似简单,但实际上涉及诸多细节和复杂操作。本文将深入介绍 UNIX 文件系统的创建、维护和修复,旨在帮助读者全面理解和掌握相关知识。 2. 文件系统基础 2.1 文件系…

作者头像 李华
网站建设 2026/4/1 17:15:58

vue小程序基于Python 聚优惠校园宿舍寝室小卖部系统_4pl6ef1c_

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;同时还支持java、ThinkPHP、Node.js、Spring B…

作者头像 李华
网站建设 2026/4/1 17:57:07

AI编程:Trae CN用户规则和项目规则定义分享

诸神缄默不语-个人技术博文与视频目录 文章目录1. 用户规则2. 项目规则1. 网站前端3. 参考资料1. 用户规则 位置在C:\Users\user_name.trae-cn\user_rules.md下&#xff0c;Trae CN官方引导&#xff1a; 参考提示词&#xff1a; **核心理念与原则** > **简洁至上**&#…

作者头像 李华