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

相关推荐
Pluchon4 小时前
Java个人综合项目——萌部落社区V2.0
java·python·spring·spring cloud·postman·idea
梦雨生生4 小时前
java开发工具(学习第一天)
java·开发语言·学习
她说可以呀5 小时前
Spring-ai-alibaba文生图
java·人工智能·spring
刘名喜6 小时前
第24篇-全局异常处理
kotlin·springboot
松仔log7 小时前
Java中级——组合和继承
android·java·开发语言
不才不才不不才7 小时前
Spring 源码系列(16): doDispatch 全流程——一次请求的主干链路
java·后端·spring
snow@li7 小时前
HikariCP:高性能数据库连接池全景深入梳理
java·数据库
sugar__salt8 小时前
Spring 三层架构与 IoC、依赖注入完全指南
java·spring boot·后端·spring·架构·maven·intellij-idea
edwarddamon8 小时前
Spring Cloud 配置热更新与 Bean 代理机制梳理
java·后端
Raas1008 小时前
MAIGateway,魔芋企业级AI网关的FinAPI成本竞争力设计
java·后端·网关·api网关·魔芋ai·finapi·mai gateway