Android Jetpack 狠活Lifecycles與LiveData使用詳解
前言
今天在工作時,測試突然提了一個Bug給我,要求我將APP中某活動頁面的UI界面要根據(jù)用戶在由此頁面跳轉(zhuǎn)的下個頁面操作,在返回時要實時更新。

在檢查代碼時,發(fā)現(xiàn)我已經(jīng)對界面可變數(shù)據(jù)用LiveData去觀測,但由于頁面變化后并沒有重新初始化UI,所以我放在初始化UI的請求根本沒有起效,如上圖所示例子,在進入下一個頁面如若關(guān)閉開關(guān),返回時無法及時更新,于是我便想到了安卓科技與狠活Lifecycles,去監(jiān)聽onResume,在resume時用livedata去post數(shù)據(jù)。
正篇
說了這么多但我們并沒有看到代碼,也即是LiveData是如何用的,所以下面我們先從代碼示例看起:
class MainViewModel(countReserved: Int) : ViewModel() {
val counter : LiveData<Int>
get() = _counter
private var _counter = MutableLiveData<Int>()
init {
_counter.value = countReserved
}
fun plusOne() {
var count = _counter.value ?: 0
_counter.value = count + 1
}
fun clear() {
_counter.value = 0
}
}
上面代碼用到了我們之前說的ViewModel,與之前不同的是,我們?yōu)樗某蓡T變量添加了LiveData,而且通過_counter設(shè)置私有變量的形式對外部不可見,使LiveData就不可變了,這樣就能在非ViewModel中只能觀察LiveData數(shù)據(jù)變化,而不能給LiveData設(shè)置數(shù)據(jù)。
為什么要這樣做呢?這就不得不提一下上節(jié)我們的ViewModel生命周期問題,它是長與Activity的,這就可能導(dǎo)致Activity的實例傳給ViewModel,而Activity無法釋放造成內(nèi)存泄漏,我們是絕對不能那樣寫的。
而LiveData可以包含任何類型數(shù)據(jù),還能在數(shù)據(jù)變化時候通知給觀察者,這樣就能在數(shù)據(jù)變化時主動去通知Activity。
接下來我們再來看看上篇文章中寫成的計數(shù)器的Activity是如何變化的:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
...
...
var infoText : TextView = findViewById(R.id.infoText)
plusOneBtn.setOnClickListener {
viewModel.plusOne()
}
clearBtn.setOnClickListener {
viewModel.clear()
}
viewModel.counter.observe(this, Observer { count ->
infoText.text = count.toString()
})
}
override fun onPause() {
super.onPause()
sp.edit {
putInt("count_reserved",viewModel.counter.value ?: 0)
}
}
我們通過對LiveData的counter實例observe觀察從而改變了計數(shù)器,效果如下:

我們可以看到,該計數(shù)器效果沒有變化,但是實際上我們已經(jīng)將ui數(shù)據(jù)的改變通過ViewModel去實現(xiàn),這樣的代碼更科學也更合理,而且不用擔心ViewModel內(nèi)部會不會開啟線程執(zhí)行耗時邏輯。
但切記:如果在子線程給LiveData設(shè)置數(shù)據(jù),一定得調(diào)用postValue()方法,而不能使用setValue()方法,否則會導(dǎo)致異常崩潰。
結(jié)語
LiveData應(yīng)付正常的情況足夠了,但工作還是出現(xiàn)了Bug,畢竟需要我們手動去獲取value,所以本篇LiveData知識部分準備完成,下一篇我們將帶大家去看看Leftcycles是如何亡羊補牢,力挽狂瀾。
以上就是Android Jetpack 狠活Lifecycles與LiveData使用詳解的詳細內(nèi)容,更多關(guān)于Jetpack Lifecycles LiveData的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android實戰(zhàn)打飛機游戲之實現(xiàn)主角以及主角相關(guān)元素(3)
這篇文章主要為大家詳細介紹了Android實戰(zhàn)打飛機游戲之實現(xiàn)主角以及主角相關(guān)元素,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-07-07
Android 中ListView setOnItemClickListener點擊無效原因分析
這篇文章主要介紹了Android 中ListView setOnItemClickListener點擊無效原因分析的相關(guān)資料,需要的朋友可以參考下2016-01-01
Android操作存放在assets文件夾下SQLite數(shù)據(jù)庫的方法
這篇文章主要介紹了Android操作存放在assets文件夾下SQLite數(shù)據(jù)庫的方法,實例分析了Android操作SQLite數(shù)據(jù)庫的相關(guān)技巧,需要的朋友可以參考下2015-06-06
Android仿支付寶笑臉刷新加載動畫的實現(xiàn)代碼
這篇文章主要介紹了Android仿支付寶笑臉刷新加載動畫的實現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2016-11-11
Android開發(fā)實現(xiàn)ImageView加載攝像頭拍攝的大圖功能
這篇文章主要介紹了Android開發(fā)實現(xiàn)ImageView加載攝像頭拍攝的大圖功能,涉及Android基于ImageView的攝像頭拍攝圖片加載、保存及權(quán)限控制等相關(guān)操作技巧,需要的朋友可以參考下2017-11-11
Android 將網(wǎng)絡(luò)的Url資源轉(zhuǎn)換為Drawable資源方式
這篇文章主要介紹了Android 將網(wǎng)絡(luò)的Url資源轉(zhuǎn)換為Drawable資源方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Android?Compose狀態(tài)改變動畫animateXxxAsState使用詳解
這篇文章主要為大家介紹了Android?Compose狀態(tài)改變動畫animateXxxAsState使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11

