引言
設計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、流水不腐小夏等實力悍將的經驗分享