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 老项目迁移系列,持续更新中。

相关推荐
阿pin7 小时前
Android随笔-IntentService详解(了解)
android·intentservice
海天鹰7 小时前
content://com.android.externalstorage.documents/document/primary%3A
android
烛影摇红透纱窗8 小时前
ForkJoinPool 与工作窃取
java
浩瀚地学8 小时前
【面试算法笔记】0302-哈希表-哈希表实现
java·经验分享·笔记·算法·面试
AC赳赳老秦8 小时前
时间开销自动统计:OpenClaw 记录工作任务时长、分析时间分配、给出优化建议
java·大数据·开发语言·python·自动化·deepseek·openclaw
帅帅的记忆9 小时前
uniapp项目调用原生android studio的sdk文件(即aar文件)
android·uni-app·android studio
名侦探7229 小时前
构建 Agent 的五大难点与解决方案
java·大数据·人工智能
Demons_kirit9 小时前
图库原理(以阿里云OSS为案例)
java·阿里云·云计算
SimonKing9 小时前
那个号称"对标 Spring"的国产框架 Solon,到底行不行?
java·后端·程序员
Lethehong9 小时前
飞算Java:从需求梳理到风险闭环,搭建云盾企业信息安全与权限管理平台
java·开发语言