You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio项目重构:MVC/MVVM模式实现指导求助

从MVC模式入手,一步步重构你的Android项目

作为新手,MVC是比MVVM更易上手的架构,核心是把代码拆成三个职责明确的部分,下面是具体的实施步骤:

一、先搞懂MVC三个模块的核心职责

  • Model层:只处理数据相关逻辑——比如网络请求、本地存储(SharedPreferences/数据库)、数据计算,完全不涉及任何界面操作(比如findViewById、Toast)
  • View层:负责界面展示和用户交互——就是你的XML布局文件,加上Activity/Fragment里的控件初始化、数据显示、点击监听等纯界面操作
  • Controller层:作为中间协调者(通常就是你的Activity/Fragment),接收View的用户事件,调用Model获取/处理数据,再把结果传给View显示

二、分步重构示例(以用户信息页面为例)

假设你之前把所有代码都堆在Activity里,现在一步步拆分:

1. 抽离Model层

新建UserModel类,把所有数据相关的逻辑移过去:

// UserModel.kt
class UserModel {
    // 模拟网络请求获取用户信息(实际项目替换为Retrofit/OkHttp代码)
    fun getUserInfo(userId: String): User {
        return User(userId, "张三", "zhangsan@example.com")
    }

    // 模拟保存用户信息(实际项目替换为SharedPreferences/数据库代码)
    fun saveUserInfo(user: User) {
        // 这里写存储逻辑
    }
}

// 纯数据类,只用来承载数据
data class User(val id: String, val name: String, val email: String)

2. 整理View+Controller层(原Activity)

Activity只保留界面相关代码,作为View和Controller的结合体:

// UserActivity.kt
class UserActivity : AppCompatActivity() {
    private lateinit var tvUserName: TextView
    private lateinit var tvUserEmail: TextView
    private lateinit var btnSave: Button
    private lateinit var userModel: UserModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_user)
        initViews()
        initModel()
        loadAndShowUserInfo()
    }

    // 只负责初始化控件和设置监听
    private fun initViews() {
        tvUserName = findViewById(R.id.tv_user_name)
        tvUserEmail = findViewById(R.id.tv_user_email)
        btnSave = findViewById(R.id.btn_save)

        // 用户点击事件交给Controller处理
        btnSave.setOnClickListener {
            val updatedUser = User("1001", tvUserName.text.toString(), tvUserEmail.text.toString())
            userModel.saveUserInfo(updatedUser)
            Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show()
        }
    }

    private fun initModel() {
        userModel = UserModel()
    }

    // Controller协调Model和View:从Model拿数据,传给View显示
    private fun loadAndShowUserInfo() {
        val user = userModel.getUserInfo("1001")
        showUserInfo(user)
    }

    // 纯View操作:只负责把数据显示到界面
    private fun showUserInfo(user: User) {
        tvUserName.text = user.name
        tvUserEmail.text = user.email
    }
}

3. 迁移现有代码的实用技巧

  • 小步拆分:不要一次性重构整个项目,先挑一个最简单的功能(比如用户信息展示、登录请求)拆分,跑通后再处理其他功能
  • 边界清晰:迁移时严格遵循:只要是和数据有关的代码,就丢给Model;只要是和界面有关的,就留在View/Controller;Controller只做中间协调,不处理具体业务逻辑
  • 测试验证:每拆分完一个模块,运行测试确保功能正常,避免一次性改太多导致bug

三、为什么推荐新手先学MVC?

相比MVVM需要学习ViewModel、LiveData、DataBinding等新组件,MVC不需要额外依赖,只用你已经熟悉的Activity/Fragment和普通类就能实现,上手门槛低,能快速体会到代码分层的好处。

内容的提问来源于stack exchange,提问作者harry powers

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 04:15:30