MVVM Android ViewModelProvider 和 Factory 的使用指南

MVVM(Model-View-ViewModel)是一种设计模式,用于分离用户界面(UI)和业务逻辑。在 Android 开发中,MVVM 模式通过使用 ViewModel 和 LiveData 等组件来实现。ViewModelProvider 和 Factory 是 MVVM 架构中的关键组件,它们帮助我们管理 ViewModel 的生命周期和依赖。

流程图

以下是使用 ViewModelProvider 和 Factory 的流程图:

Activity ViewModelProvider ViewModel Repository Data Source

代码示例

1. ViewModel 类

首先,我们创建一个 ViewModel 类,它将持有 UI 相关的数据和逻辑。

class MyViewModel(private val repository: MyRepository) : ViewModel() {
    val data: LiveData<String> = repository.getData()
}
  • 1.
  • 2.
  • 3.
2. Repository 接口

接下来,我们定义一个 Repository 接口,它将负责与数据源交互。

interface MyRepository {
    fun getData(): LiveData<String>
}
  • 1.
  • 2.
  • 3.
3. Factory 类

然后,我们创建一个 Factory 类,用于提供 ViewModel 的实例。

class MyViewModelFactory(private val repository: MyRepository) : ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
            return MyViewModel(repository) as T
        }
        throw IllegalArgumentException("Unknown ViewModel class")
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
4. Activity 中使用 ViewModel

最后,在 Activity 中,我们使用 ViewModelProvider 和 Factory 来获取 ViewModel 的实例。

class MyActivity : AppCompatActivity() {
    private lateinit var viewModel: MyViewModel

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

        val repository = MyRepositoryImpl()
        val factory = MyViewModelFactory(repository)
        viewModel = ViewModelProvider(this, factory).get(MyViewModel::class.java)

        viewModel.data.observe(this, Observer { data ->
            // 更新 UI
        })
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

类图

以下是 ViewModel、Repository 和 Factory 的类图:

ViewModel + LiveData data Repository +LiveData getData() MyViewModel - MyRepository repository + LiveData data MyRepositoryImpl +LiveData getData() MyViewModelFactory - MyRepository repository ViewModelProvider.Factory +T create(Class modelClass)

结语

通过使用 ViewModelProvider 和 Factory,我们可以更好地管理 ViewModel 的生命周期和依赖,从而使我们的 Android 应用更加模块化和易于维护。MVVM 模式不仅提高了代码的可读性和可测试性,还有助于实现更高效的 UI 更新和数据绑定。