日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

android数据流分类,【Android工程之类】1 MVVM架构 - MVVM与单向数据流

發(fā)布時(shí)間:2023/12/2 Android 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android数据流分类,【Android工程之类】1 MVVM架构 - MVVM与单向数据流 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

這個(gè)系列將講述使用MVVM架構(gòu)、LiveData、Room、Kodein、Retrofit、EventBus來(lái)建立一個(gè)統(tǒng)一的、優(yōu)雅的、可維護(hù)的TODO程序,本系列分為多個(gè)章節(jié),從0開(kāi)始一步一步引入這些優(yōu)秀的庫(kù)。下圖展示的是Jetpack組件庫(kù)包含的內(nèi)容,這套的架構(gòu)方案的核心就是谷歌現(xiàn)在大力推薦的Jetpack作為基礎(chǔ),搭配外圍腳手架補(bǔ)齊Jetpack短板,還原原汁原味的優(yōu)雅Android。

多說(shuō)一句,確保團(tuán)隊(duì)對(duì)架構(gòu)有統(tǒng)一的理解是非常必要的,就好比開(kāi)團(tuán)要切adc一樣自然,如此不論是bug修復(fù)還是功能開(kāi)發(fā)都無(wú)需抽絲剝繭就能直接定位完成任務(wù)。

目錄

? MVVM架構(gòu) - MVVM與單向數(shù)據(jù)流

? LiveData - 使用ViewModel綁定UI和點(diǎn)擊事件

? EventBus - 全局事件分發(fā)

? Room - 絲滑的sqlite訪問(wèn)

? Retrofit - 絲滑的api接入

? Kodein - 引入依賴注入優(yōu)雅生成ViewModel

? Service - 使用eventbus包裝與service的通信

? Receiver和定時(shí)任務(wù) - 安裝卸載事件 各種manager的處理

? 低內(nèi)存 - 組件被回收的正確處理

? Navigation - 優(yōu)雅的Single Activity導(dǎo)航組件

? Paging - 分頁(yè)組件

復(fù)制代碼

本系列我們以構(gòu)建一個(gè)TODO APP為例,逐步分析這些這套架構(gòu)是如何發(fā)揮作用的。首先看看Android開(kāi)發(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)的任何代碼,只編寫(xiě)處理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ā)送事件來(lái)反饋用戶操作是成功還是失敗。ViewModel可以被多個(gè)Activity共享。

? Repository

對(duì)多個(gè)數(shù)據(jù)源的統(tǒng)一封裝,形成統(tǒng)一方法,比如有saveUser(user: User)方法,內(nèi)部調(diào)用遠(yuǎn)程api接口保存成功后,寫(xiě)入本地?cái)?shù)據(jù)庫(kù),函數(shù)成功返回,但對(duì)調(diào)用者來(lái)說(shuō)抽象了數(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)單起來(lái),先不加入,等到后面對(duì)應(yīng)的章節(jié)再補(bǔ)充進(jìn)去。

起步

說(shuō)了這么多廢話,動(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

接下來(lái)修改layout文件,打開(kāi)默認(rèn)創(chuàng)建的layout文件,將其用layout標(biāo)簽包裹并加入data塊,聲明變量名為viewmodel,變量類型是剛才創(chuàng)建的class。viewmodel建議全小寫(xiě),可以在activity中定義的viewModel區(qū)別開(kāi)。

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中我們使用@{}語(yǔ)法將其單向綁定到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)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。