MVC 写法 → MVVM

MVC 写法 → MVVM

老写法(Java --- Activity 承担一切)

java 复制代码
public class MainActivity extends AppCompatActivity {

    private TextView tvName;
    private ProgressBar progressBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tvName = findViewById(R.id.tv_name);
        progressBar = findViewById(R.id.progress_bar);

        loadData();
    }

    private void loadData() {
        progressBar.setVisibility(View.VISIBLE);
        api.loadUser(new Callback<User>() {
            @Override
            public void onSuccess(User user) {
                progressBar.setVisibility(View.GONE);
                tvName.setText(user.getName());
            }

            @Override
            public void onError(String msg) {
                progressBar.setVisibility(View.GONE);
                Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
            }
        });
    }
}

问题在哪里

Activity 同时负责了 UI 绘制、数据请求、状态切换和业务逻辑,一个类三四百行是常态。测试完全没法做------所有逻辑都耦合在 Activity 里。屏幕旋转后数据丢失,需要手动处理 onSaveInstanceState。

新写法(MVVM + ViewModel + LiveData)

kotlin 复制代码
// ViewModel
class MainViewModel(private val api: ApiService) : ViewModel() {

    private val _user = MutableLiveData<User>()
    val user: LiveData<User> = _user

    private val _isLoading = MutableLiveData(false)
    val isLoading: LiveData<Boolean> = _isLoading

    private val _error = MutableLiveData<String?>()
    val error: LiveData<String?> = _error

    fun loadUser() {
        viewModelScope.launch {
            _isLoading.value = true
            try {
                val result = withContext(Dispatchers.IO) { api.loadUser() }
                _user.value = result
            } catch (e: Exception) {
                _error.value = e.message
            } finally {
                _isLoading.value = false
            }
        }
    }
}

// Activity
class MainActivity : AppCompatActivity() {
    private val viewModel: MainViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        viewModel.user.observe(this) { user -> tvName.text = user.name }
        viewModel.isLoading.observe(this) { isLoading ->
            progressBar.visibility = if (isLoading) View.VISIBLE else View.GONE
        }
        viewModel.error.observe(this) { msg -> msg?.let { Toast.makeText(this, it, Toast.LENGTH_SHORT).show() } }

        viewModel.loadUser()
    }
}

一句话注意

最核心的变化:Activity 从"做事的人"变成"观察数据的人"。它不再调用接口、处理回调、切换状态,只负责监听 ViewModel 的数据变化并更新 UI。ViewModel 存活于 Activity 的生命周期之外,旋转屏幕不丢数据。

viewModels() 是 activity-ktx 里的委托,自动创建和获取 ViewModel。ViewModel 内部用 viewModelScope 启动协程,这个 scope 在 ViewModel 被清除时自动取消。


Java Android 老项目迁移系列,持续更新中。

相关推荐
蒸鱼Yuzheng14 分钟前
Android 构建可复现性:APK 指纹、文件级差异与供应链审计
android·apk·devops·软件供应链·可复现构建
不停喝水24 分钟前
【前端转全栈java速通课】 项目实战④7-11节 操作数据库-登录-注册-修改密码-注销-mubatis-plus简化crud-
java·前端·数据库
y1su30 分钟前
Leetcode 二分模板
java·数据结构·算法·leetcode·排序算法
霸道流氓气质1 小时前
多Agent通信机制与协议设计完全指南:从FIPA-ACL到A2A/MCP的Java生产级实战
java·开发语言
007张三丰1 小时前
C/C++ 内存管理详解:从内存分布到 new/delete 底层原理
java·c语言·c++·内存管理
骇客野人1 小时前
Java BIO / NIO / AIO 完整详解 + 编程技巧
java·开发语言·nio
霸道流氓气质1 小时前
OpenTelemetry 入门与实战:Java Agent、Spring Boot Starter与LLM调用追踪示例
java·开发语言·spring boot
m0_587383001 小时前
24 小时自助健身房系统软件开发实战指南与案例解析
java·spring boot·spring·系统架构·需求分析
栖凤1 小时前
Java 的 try-catch 在 Agent 里失效了,我用了 5 个模式才兜住
java·前端·python