Banson's Blog
Android Architecture
迈向结构化的 App!

应用架构

将所有数据放在 fragment 中是不明智的。更好的解决方法是,让数据归数据,视图归视图。应用架构(application architecture)有许多种,本文将介绍其中一种:

一种典型的应用架构

ViewModel

UI Controller 用来控制 UI (废话hhh) ,ViewModel 则用来准备、维护和计算提供给 UI Controller 的具体数据。ViewModel 是一个抽象类,使用时需要继承并实现这个类。ViewModel 内部存储的数据在这里实现为 LiveData.

LiveData

LiveData 是一种可观察的对象。Activity/fragment 可以观察 LiveData 数据,并在其改变时收到通知。这样一来,ViewModel 只需关心数据的计算,无需关心通知数据使用者等“杂活儿”;而 activity 也只需观察 ViewModel,在其改变时做出反应即可。

Lifecycle Awareness

LiveData 可以察觉到它的观察者(如:activity)的生命周期;例如,如果 activity 处于不活跃状态(在屏幕中不可见),LiveData 不会通知其更新数据。

这样一来,activity 和 LiveData 的“观察”实质上是双向的,如下图:

代码

ViewModel & LiveData

编辑 app:build.gradle ,添加

implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'

继承 ViewModel 类,例如, GameViewModel 类:

class GameViewModel : ViewModel() {
    var score = MutableLiveData<Int>()
    var word = MutableLiveData<String>()

    init {
        score.value = 0
        // Do something
    }

    fun updateScore() {
        // Do something
    }
}

在 fragment 或 activity 中,设置 observe 关系:

viewModel = ViewModelProviders.of(this).get(GameViewModel::class.java)
viewModel.score.observe(this, Observer { newScore ->
    binding.textViewScore = newScore
})

Last modified on 2020-07-06