android数据流分类,【Android工程之类】1 MVVM架构 - MVVM与单向数据流
前言
這個系列將講述使用MVVM架構、LiveData、Room、Kodein、Retrofit、EventBus來建立一個統一的、優雅的、可維護的TODO程序,本系列分為多個章節,從0開始一步一步引入這些優秀的庫。下圖展示的是Jetpack組件庫包含的內容,這套的架構方案的核心就是谷歌現在大力推薦的Jetpack作為基礎,搭配外圍腳手架補齊Jetpack短板,還原原汁原味的優雅Android。
多說一句,確保團隊對架構有統一的理解是非常必要的,就好比開團要切adc一樣自然,如此不論是bug修復還是功能開發都無需抽絲剝繭就能直接定位完成任務。
目錄
? MVVM架構 - MVVM與單向數據流
? LiveData - 使用ViewModel綁定UI和點擊事件
? EventBus - 全局事件分發
? Room - 絲滑的sqlite訪問
? Retrofit - 絲滑的api接入
? Kodein - 引入依賴注入優雅生成ViewModel
? Service - 使用eventbus包裝與service的通信
? Receiver和定時任務 - 安裝卸載事件 各種manager的處理
? 低內存 - 組件被回收的正確處理
? Navigation - 優雅的Single Activity導航組件
? Paging - 分頁組件
復制代碼
本系列我們以構建一個TODO APP為例,逐步分析這些這套架構是如何發揮作用的。首先看看Android開發者官網上的MVVM架構圖。
這里強調一點,使架構干凈整潔的精髓就是保持數據流單向流動。
? Activity / Fragment
View層,在這一層里,不要放和業務邏輯相關的任何代碼,只編寫處理UI邏輯的代碼和函數,供ViewModel調用。當然,ViewModel是不能直接調用activity的,否則就破壞了單項數據流了,這里可以使用接口的方式把activity中的方法傳入viewModel,當然更好的方式是使用EventBus進行事件分發。
? ViewModel
保存UI相關的變量,可以與layout中的元素進行單向或雙向的數據綁定。響應元素的onlick等事件,調用Repository完成任務,更改UI屬性值,調用傳入的回調接口或向eventbus發送事件來反饋用戶操作是成功還是失敗。ViewModel可以被多個Activity共享。
? Repository
對多個數據源的統一封裝,形成統一方法,比如有saveUser(user: User)方法,內部調用遠程api接口保存成功后,寫入本地數據庫,函數成功返回,但對調用者來說抽象了數據源的實現方法,減少上層邏輯處理負擔。
? Model / Local Data Source
本地數據源抽象層
? Remote Data Source
遠程數據源抽象層
復制代碼
但是,我們的應用一般不可能這么簡單,還會應用到service、receiver、后臺進程什么的,這里為了簡單起來,先不加入,等到后面對應的章節再補充進去。
起步
說了這么多廢話,動手創建工程吧
工程創建
首先常規操作,創建一個名叫todo的工程
在module的build.gradle中加入
android {
...
dataBinding {
enabled = true
}
}
dependencies {
...
// architectures
implementation"androidx.lifecycle:lifecycle-viewmodel-ktx:$archLifecycleVersion"
implementation"androidx.lifecycle:lifecycle-livedata-ktx:$archLifecycleVersion"
implementation"androidx.lifecycle:lifecycle-extensions:$archLifecycleVersion"
}
復制代碼
在project的build.gardle文件中統一聲明版本
ext{
archLifecycleVersion='2.2.0'
}
復制代碼
ViewModel創建
好了,一切就緒,我們首先建立我們的viewmodel,并聲明一個hello字段,LiveData是個抽象類,我們使用MutableLiveData建立一個private的實例對象,并將其賦值給hello暴露給外部。
這里hello我們給個默認值"hello",該值可空,默認為null
class MainViewModel: ViewModel() {
val _hello = MutableLiveData("hello")
val hello : LiveData = _hello
}
復制代碼
在layout中綁定ViewModel
接下來修改layout文件,打開默認創建的layout文件,將其用layout標簽包裹并加入data塊,聲明變量名為viewmodel,變量類型是剛才創建的class。viewmodel建議全小寫,可以在activity中定義的viewModel區別開。
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
name="viewmodel"
type="xyz.yuanxiaoqing.todo.MainViewModel" />
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewmodel.hello}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
復制代碼
在textview中我們使用@{}語法將其單向綁定到hello變量上
MainActivity
好了,最后一步,將viewmodel實例化綁定到layout中。這里直接實例化了MainViewModel,僅作為演示,后面章節將介紹如何優雅生成這個對象。這個ActivityMainBinding是什么?他是Android Studio自動根據R.layout.activity_main生成的Binding對象。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: ActivityMainBinding =
DataBindingUtil.setContentView(this, R.layout.activity_main)
val viewModel = MainViewModel()
binding.apply {
viewmodel = viewModel
}
}
}
復制代碼
ok,成功綁定。
總結
以上是生活随笔為你收集整理的android数据流分类,【Android工程之类】1 MVVM架构 - MVVM与单向数据流的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android listview map
- 下一篇: 下载 沙耶之歌Android_沙耶之歌安