引言
设计App架构的基本原则
Soc 原则 ,Separation of concerns 分离关注点原则 。简单来说就是模块化,低耦合。从Android 角度来说就是不要将任何有关UI操作以及调用系统组件的无关方法放到View层的Activity 或是Fragment类中。具体原因大家都知道的,系统内存不足,资源紧张时候会随时主动kill掉view层的一些资源,如果这时候别的类还持有该类的引用,会造成内存泄露等问题。
Model驱动Ui ,用持久化的数据的Model(保存到本地的数据)。
优点:
a、数据是持久化存储的,所以当系统因为各种原因回收资源时候,并不会造成数据的丢失。
b、在网络异常状态下依然能有效访问数据。
Architecture Components
定义
Google IO 2017年 发布的Android Architecture Components 一套新的构架组件,在MVVM框架基础上简单的使用了Room、liveData,ViewModel框架组件,使得App架构更加健壮。
A new collection of libraries that help you design robust, testable,and maintainable apps.
这是一个帮助构建稳定,易于测试和易于维护的App架构的新库
架构图:

导入Kotlin
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"// use -ktx for Kotlin
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version”
-
官方提供方法:--需要VPN
在根目录gradle中添加相关依赖:
allprojects {
repositories {
jcenter()
maven { url'
https://maven.google.com'}//添加此行
}
}
- 非官方提供方法:
1、在项目的build.gradle中添加依赖:
allprojects {
repositories {
jcenter()
maven { url‘https://dl.google.com/dl/android/maven2'}//添加此行
}
}
2、在app/build.gradle中添加依赖:
//dependencies for Architecutre Components
def lifecycle_version = “1.1.1"
//For Lifecycles
implementation "android.arch.lifecycle:extensions:$lifecycle_version"
implementation "android.arch.lifecycle:$lifecycle_version"
//lifecycles only (no Viewmodel or liveData)
//For ViewModel-alternatively
implementation "android.arch.lifecycle:viewmodel1: $lifecycle_version"
//For LiveData -alternatively
implementation "android.arch.lifecycle:livedata: $lifecycle_version"
//support library depend on this lightweight import
//annotationProcessor "android.arch.lifecycle:common-java8:$livecycle_version"
implementation "android.arch.lifecycle:runtime: $lifecycle_version"
//optional Test helpers for liveData
testImplementation "android.arch.cor:core-testing:$lifecycle_version"
//For Room
def room_version ="1.1.0"
implementation "android.arch.persistence.room:runtime:$room_version"
annotationProcessor "android.arch.persistence.room:compiler:$room_version"
// For testing Room migrations, add:
// testImplementation "android.arch.persistence.room:testing:$room_version"
// For Room RxJava support, add:
implementation "android.arch.persistence.room:rxjava2:$room_version"
配置DataBinding依赖:
android {
…
dataBinding{
enabled = true
}
}
配置Room schemaLocation依赖:
android {
…
defaultConfig{
//指定room.schemaLocation生成的文件路径
javaCompileOptions{
annotationProcessorOptions{
arguments = [ “room.schemaLocation”: "$projectDir/schemas”.toString() ]
}
}
}
}
组成
- LifeCycle
生命周期管理,把原先Android生命周期中的代码抽取出来,比如将原先需要在OnStart()等生命周期方法中执行的代码分离出来到Activity 或是Fragment之外。
- LiveData
一个数据持有类,持有数据并且这个数据可以被观察被监听着,它需要和上面的LifeCycle绑定,在生命周期内使用才有效,减少内存泄露和引用问题。
- ViewModel
用于实现架构中的ViewModel,同时也是与LifeCycle绑定的,使用者无需担心生命周期。可以在多个Fragment之间共享数据。 ex:旋转屏幕后Activity重新create,这时候viewModel持有之前的数据不需要再次重新进行网络读取。
- Room
google推出的一个SQLite ORM库,极大简化数据库的操作,类似于Retrofit风格。

如图,Architecture Components主要提供了Lifecycle、LiveData、ViewModel、Room等以上这些功能。
架构图
- Activity/Fragment
UI层,绘制用户交互界面,监听ViewModel,当ViewModel数据更新时刷新UI,监听用户事件反馈到ViewModel。
- ViewModel
持有或保存数据,向Repository中获取数据,响应UI层的事件,执行响应的操作,响应数据变化并通知到UI层。
- Repository
App的完全的数据模型,ViewModel交互的对象,提供简单的数据修改和获取的接口,配合网络层数据的更新与本地持久化数据的更新同步问题。
- Data Source
包含本地SQLite数据库,网络APi等。
系列文章列表:
本系列参考合集资料链接:
再次感谢作者:sunjenry 、H029982384、流水不腐小夏等实力悍将的经验分享