android数据流分类,【Android工程之类】1 MVVM架构 - MVVM与单向数据流
前言
這個(gè)系列將講述使用MVVM架構(gòu)、LiveData、Room、Kodein、Retrofit、EventBus來建立一個(gè)統(tǒng)一的、優(yōu)雅的、可維護(hù)的TODO程序,本系列分為多個(gè)章節(jié),從0開始一步一步引入這些優(yōu)秀的庫。下圖展示的是Jetpack組件庫包含的內(nèi)容,這套的架構(gòu)方案的核心就是谷歌現(xiàn)在大力推薦的Jetpack作為基礎(chǔ),搭配外圍腳手架補(bǔ)齊Jetpack短板,還原原汁原味的優(yōu)雅Android。
多說一句,確保團(tuán)隊(duì)對(duì)架構(gòu)有統(tǒng)一的理解是非常必要的,就好比開團(tuán)要切adc一樣自然,如此不論是bug修復(fù)還是功能開發(fā)都無需抽絲剝繭就能直接定位完成任務(wù)。
目錄
? MVVM架構(gòu) - MVVM與單向數(shù)據(jù)流
? LiveData - 使用ViewModel綁定UI和點(diǎn)擊事件
? EventBus - 全局事件分發(fā)
? Room - 絲滑的sqlite訪問
? Retrofit - 絲滑的api接入
? Kodein - 引入依賴注入優(yōu)雅生成ViewModel
? Service - 使用eventbus包裝與service的通信
? Receiver和定時(shí)任務(wù) - 安裝卸載事件 各種manager的處理
? 低內(nèi)存 - 組件被回收的正確處理
? Navigation - 優(yōu)雅的Single Activity導(dǎo)航組件
? Paging - 分頁組件
復(fù)制代碼
本系列我們以構(gòu)建一個(gè)TODO APP為例,逐步分析這些這套架構(gòu)是如何發(fā)揮作用的。首先看看Android開發(fā)者官網(wǎng)上的MVVM架構(gòu)圖。
這里強(qiáng)調(diào)一點(diǎn),使架構(gòu)干凈整潔的精髓就是保持?jǐn)?shù)據(jù)流單向流動(dòng)。
? Activity / Fragment
View層,在這一層里,不要放和業(yè)務(wù)邏輯相關(guān)的任何代碼,只編寫處理UI邏輯的代碼和函數(shù),供ViewModel調(diào)用。當(dāng)然,ViewModel是不能直接調(diào)用activity的,否則就破壞了單項(xiàng)數(shù)據(jù)流了,這里可以使用接口的方式把a(bǔ)ctivity中的方法傳入viewModel,當(dāng)然更好的方式是使用EventBus進(jìn)行事件分發(fā)。
? ViewModel
保存UI相關(guān)的變量,可以與layout中的元素進(jìn)行單向或雙向的數(shù)據(jù)綁定。響應(yīng)元素的onlick等事件,調(diào)用Repository完成任務(wù),更改UI屬性值,調(diào)用傳入的回調(diào)接口或向eventbus發(fā)送事件來反饋用戶操作是成功還是失敗。ViewModel可以被多個(gè)Activity共享。
? Repository
對(duì)多個(gè)數(shù)據(jù)源的統(tǒng)一封裝,形成統(tǒng)一方法,比如有saveUser(user: User)方法,內(nèi)部調(diào)用遠(yuǎn)程api接口保存成功后,寫入本地?cái)?shù)據(jù)庫,函數(shù)成功返回,但對(duì)調(diào)用者來說抽象了數(shù)據(jù)源的實(shí)現(xiàn)方法,減少上層邏輯處理負(fù)擔(dān)。
? Model / Local Data Source
本地?cái)?shù)據(jù)源抽象層
? Remote Data Source
遠(yuǎn)程數(shù)據(jù)源抽象層
復(fù)制代碼
但是,我們的應(yīng)用一般不可能這么簡(jiǎn)單,還會(huì)應(yīng)用到service、receiver、后臺(tái)進(jìn)程什么的,這里為了簡(jiǎn)單起來,先不加入,等到后面對(duì)應(yīng)的章節(jié)再補(bǔ)充進(jìn)去。
起步
說了這么多廢話,動(dòng)手創(chuàng)建工程吧
工程創(chuàng)建
首先常規(guī)操作,創(chuàng)建一個(gè)名叫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"
}
復(fù)制代碼
在project的build.gardle文件中統(tǒng)一聲明版本
ext{
archLifecycleVersion='2.2.0'
}
復(fù)制代碼
ViewModel創(chuàng)建
好了,一切就緒,我們首先建立我們的viewmodel,并聲明一個(gè)hello字段,LiveData是個(gè)抽象類,我們使用MutableLiveData建立一個(gè)private的實(shí)例對(duì)象,并將其賦值給hello暴露給外部。
這里hello我們給個(gè)默認(rèn)值"hello",該值可空,默認(rèn)為null
class MainViewModel: ViewModel() {
val _hello = MutableLiveData("hello")
val hello : LiveData = _hello
}
復(fù)制代碼
在layout中綁定ViewModel
接下來修改layout文件,打開默認(rèn)創(chuàng)建的layout文件,將其用layout標(biāo)簽包裹并加入data塊,聲明變量名為viewmodel,變量類型是剛才創(chuàng)建的class。viewmodel建議全小寫,可以在activity中定義的viewModel區(qū)別開。
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" />
復(fù)制代碼
在textview中我們使用@{}語法將其單向綁定到hello變量上
MainActivity
好了,最后一步,將viewmodel實(shí)例化綁定到layout中。這里直接實(shí)例化了MainViewModel,僅作為演示,后面章節(jié)將介紹如何優(yōu)雅生成這個(gè)對(duì)象。這個(gè)ActivityMainBinding是什么?他是Android Studio自動(dòng)根據(jù)R.layout.activity_main生成的Binding對(duì)象。
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
}
}
}
復(fù)制代碼
ok,成功綁定。
總結(jié)
以上是生活随笔為你收集整理的android数据流分类,【Android工程之类】1 MVVM架构 - MVVM与单向数据流的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android listview map
- 下一篇: 寒冰ad出装(寒冰adc出装)