Android開發(fā)Jetpack組件ViewModel與LiveData使用講解
一、ViewModel
ViewModel是介于View(視圖)和Model(數(shù)據(jù)模型)之間的中間層,能夠使視圖和數(shù)據(jù)分離,又能提供視圖和數(shù)據(jù)之間的通信。如圖所示:

1、解決的問題
- 屏幕翻轉(zhuǎn)后頁面數(shù)據(jù)的丟失;
- 異步調(diào)用導(dǎo)致的內(nèi)存泄露;
- 類膨脹提高維護難度和測試難度;
2、注意點事項
- ViewModel的生命周期要比Activity的生命周期更長,因此在使用ViewModel時,不要向ViewModel傳入Activity的Context,因為這樣會導(dǎo)致內(nèi)存泄露。
- 如果必須使用Context,可使用AndroidViewModel中的Application。
3、ViewModel案例
我們知道,Android橫豎屏切換時,當(dāng)前的Activity會被銷毀重建,然后Activity上面的數(shù)據(jù)將會全部丟失。(如Listview上面每個item的checkbox,橫豎屏切換時,復(fù)選框就丟失所有選中信息)。一般,我們解決辦法是,在配置清單Androidmanifest.xml的activity標簽中加入android:configChanges="orientation|keyboardHidden",或在Activity里面通過復(fù)寫onConfigurationChanged方法,實現(xiàn)在不同的屏幕狀態(tài)下的處理方式。
那么,使用ViewModel將會是怎樣的?
首先,創(chuàng)建一個連接層類MyViewModel.kt 繼承AndroidViewModel,里面定義了number變量。
class MyViewModel(application: Application) : AndroidViewModel(application) {
var number = 0 //
}然后,在activity中使用:
class TestActivity : AppCompatActivity() {
private var textView: TextView? = null
private var viewModel: MyViewModel? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
textView = findViewById(R.id.textView)
//實例化viewModel
viewModel =ViewModelProvider(this,
AndroidViewModelFactory(application))[MyViewModel::class.java]
//顯示數(shù)據(jù)
textView!!.text = String.valueOf(viewModel!!.number)
}
//點擊事件
fun plusNumber(view: View) {
textView!!.text = String.valueOf(++viewModel!!.number)
}
}實例化對應(yīng)的viewModel后,通過訪問viewModel里的屬性number,不管怎么切換橫豎屏,對應(yīng)的屏幕上的數(shù)字都不會被清空。
二、LiveData
如上案例中,如果點擊事件只是改變了viewmodel中的number值,text就不會刷新顯示。LiveData就是一個能夠在ViewModel中數(shù)據(jù)發(fā)生變化時通知頁面刷新UI線程的組件庫。LiveData和ViewModel的關(guān)系,如下圖所示:

1、viewmodel+livedata使用案例
首先,修改一下MyViewModel.kt
class MyViewModel : ViewModel() {
//定義LiveData集合
private var linkNumber: MutableLiveData<Int>? = null
//得到LiveData集合
fun getLinkNumber(): MutableLiveData<Int>? {
if (linkNumber == null) {
//初始化
linkNumber = MutableLiveData()
linkNumber!!.value = 0
}
return linkNumber
}
//給外部提供修改集合內(nèi)部屬性的方法
fun addLinkedNumber(n: Int) {
linkNumber!!.value = linkNumber!!.value!! + n
}
}在activity中使用:
class MainActivity : AppCompatActivity() {
private var viewModel: MyViewModel? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val textView: TextView = findViewById(R.id.textView)
viewModel =ViewModelProvider(this,
AndroidViewModelFactory(application))[MyViewModel::class.java]
//觀察
viewModel!!.getLinkNumber()!!.observe(this, Observer {
textView.text = String.valueOf(it)
})
}
fun reduce(view: View) {
viewModel!!.addLinkedNumber(-1)
}
fun add(view: View) {
viewModel!!.addLinkedNumber(1)
}
}上面案例中,ViewModel的初始化不變。在點擊事件中調(diào)用addLinkedNumber()方法,對ViewModel對應(yīng)LiveData集合進行修改操作。viewModel!!.getLinkNumber()!!.observe(this, Observer {xx},來接受ViewModel發(fā)過來的修改通知,并及時更新至textView上。
2、viewmodel+livedata
優(yōu)勢總結(jié)
- 頁面翻轉(zhuǎn)數(shù)據(jù)狀態(tài)保留
- 不再需要手動處理生命周期
- 數(shù)據(jù)始終保持最新狀態(tài)
- 不會發(fā)生內(nèi)存泄露
- 異步情況,不會因Activity停止而導(dǎo)致崩潰
到此這篇關(guān)于Android開發(fā)Jetpack組件ViewModel與LiveData使用講解的文章就介紹到這了,更多相關(guān)Android Jetpack組件ViewModel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Kotlin協(xié)程Dispatchers原理示例詳解
這篇文章主要為大家介紹了Kotlin協(xié)程Dispatchers原理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08
Kotlin Select協(xié)程多路復(fù)用的實現(xiàn)詳解
select是Kotlin 1.6中的特性,即選擇最快的結(jié)果。select與async、Channel結(jié)合使用,可以大大提高程序的響應(yīng)速度,還可以提高程序的靈活性、擴展性2022-09-09
Android 使用Vitamio打造自己的萬能播放器(7)——在線播放(下載視頻)
本文主要介紹Android Vitamio開發(fā)播放器,這里提供在線播放和下載視頻實例代碼,有需要的小伙伴可以參考下2016-07-07
Android 開發(fā)仿簡書登錄框可刪除內(nèi)容或顯示密碼框的內(nèi)容
本文通過實例代碼給大家分享android開發(fā)中模仿簡書登錄框可刪除內(nèi)容或顯示密碼框的內(nèi)容,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2016-12-12
利用 kotlin 的方式自定義回調(diào)事件(kotlin函數(shù)參數(shù))
這篇文章主要介紹了利用 kotlin 的方式自定義回調(diào)事件(kotlin函數(shù)參數(shù)),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Android開發(fā)實現(xiàn)繪制淘寶收益圖折線效果示例
這篇文章主要介紹了Android開發(fā)實現(xiàn)繪制淘寶收益圖折線效果,涉及Android canvas圖形繪制及布局控制相關(guān)操作技巧,需要的朋友可以參考下2017-11-11
Android 實現(xiàn)IOS 滾輪選擇控件的實例(源碼下載)
這篇文章主要介紹了 Android 實現(xiàn)IOS 滾輪選擇控件的實例(源碼下載)的相關(guān)資料,需要的朋友可以參考下2017-03-03

