技术学习

今日的技术学习内容为ViewModel和LiveData,这部分的内容相当于就是Android的架构学习,了解一个Android项目由哪些部分组成,如何去按照规范分层编写代码。

Android架构

MVVM(Model-View-ViewModel)

Google 2015年I/O大会上推出了DataBinding的框架,使用了MVVM的模式,MVVM的思想就是从APP的业务逻辑中分离数据持久层。

  • Model: 实体类模型。Model提供了数据提取接口供ViewModel使用,经过数据转换和操作最终映射绑定到View层的某个UI元素的属性上。

  • View: 对应Activity和XML布局文件。不进行业务代码的编码,主要作用初始化控件,处理事件。简单地说:View层不做任何业务逻辑、不涉及操作数据、不处理数据,UI和数据严格的分开。

  • ViewModel: 负责完成View和Model之间的交互。ViewModel只做和业务逻辑和业务数据相关的事,不做任何和UI相关的事情,ViewModel 层不会持有任何控件的引用,更不会在ViewModel中通过UI控件的引用去做更新UI的事情。

https://tech.meituan.com/2016/11/11/android-mvvm.html

AAC(Android Architecture Components)

Google 2017年I/O大会上发布了AAC,个人感觉就是在上述MVVM的基础上封装好了所有实现的组件,开发者仅需调用即可。其包含一下框架或者组件:

  1. ROOM: 类似于JPA的持久层框架,用于数据的持久化解决方案。
  2. WorkManager: 管理后台任务,类似于一个框架去管理后台的Service。
  3. Lifecycle: 存储生命周期状态并且允许其它组件访问。
  4. ViewModel: 上面MVVM架构中的ViewModel的实现,专注于业务的处理。
  5. LiveData: 使用LiveData构建数据对象,在数据改变的时候,UI改变。
  6. Navigation:导航,负责页面的跳转。

重点在于Room、ViewModel、LiveData、Navigation的使用,前面已经学习了Navigation,主要用于Fragment的跳转,可以定义不同的action,执行去执行该Action来进行不同Fragment的跳转。下面学习比较重要的ViewModel和LiveData。

LiveData

观察者模式

之前一直没有领悟到观察者模式的精髓,在Android中有很多地方都使用了观察者模式,比如,监听点击事件。对于观察者来说,它并不关心观察对象的数据是如何过来的,而只关心数据过来后进行怎样的处理。

LiveData格式

在写代码的时候根据固定的格式可以很轻松的写出LiveData的数据观察,ViewModel中定义LiveData,Fragment或者Activity中绑定ViewModel,然后监听LiveData的改变。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
    // viewModel中定义LiveData 以及LiveData改变的处理逻辑
    // 下面这段代码就是定义了一个游戏结束的flag,
    private val _eventGameFinish = MutableLiveData<Boolean>()
    val eventGameFinish: LiveData<Boolean>
        get() = _eventGameFinish

    // 然后在fragment中监听LiveData的更新 根据LiveData中存储的flag进行不同的页面处理
    viewModel.eventGameFinish.observe(viewLifecycleOwner, Observer { hasFinished ->
        if (hasFinished) {
            gameFinished()
        }
    })

在其中有几个点需要明确一下:

  • MutableLiveData: 父类LiveData

    • LiveData中的类型如果是实体类则可以指定某个字段的数据更新,而MutableLiveData则要整个实体类或者基础数据类型的值发生改变话才会通知,不会具体到细节。
    • LiveData不可变,MutableLiveData可变。重点说下可变和不可变,LiveData的属性为protected,而MutableLiveData为public
  • viewLifecycleOwner: 这里的为什么不用this,下面这篇博文讲的很好。

https://juejin.cn/post/6915222252506054663

LiveData原理

原理直接看博文吧,这个博主的系列都值得一看。

https://juejin.cn/post/6844903748574117901

ViewModel

ViewModel将数据的处理和View层剥离开来,专注于数据的处理。这部分的代码比较容易理解,具体直接看官方文档的ViewModel即可。

https://developer.android.com/topic/libraries/architecture/viewmodel?hl=zh-cn