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

相关推荐
Wang's Blog1 小时前
Java 接入Redis: 服务启动停止与后台运行配置
java·服务器·redis
此时不提桶,更待何时2 小时前
01-04-B-垃圾回收面试与生产事故实战
java·jvm·面试
北京自在科技3 小时前
谷歌 Find Hub 迎来新版本更新
android·安卓
鹿角片ljp4 小时前
KV Cache 解析
java·算法
captain3764 小时前
网络原理(9)-数据链路层
java·网络协议·java-ee
惊讶的猫4 小时前
意图识别置信度和检索重排的分数
java
caoerzhong5 小时前
仓库管理数字化趋势解读:JeeWMS 开源 Java WMS 视角下的五个演进方向
java·开源
程序员JerrySUN5 小时前
Jetson Edge AI 实战01:Nano、Xavier、Orin 怎么选?Jetson 硬件选型详解【视频讲解】
java·数据库·redis·安全·mybatis
Joy T6 小时前
Spring AI 2.0 Agent 进阶:Memory、State 与 Context Engineering 常见技术全景
java·人工智能·后端·spring·agent入门·agent state