Android Jetpack 狠活Lifecycles與LiveData使用詳解
前言
今天在工作時(shí),測(cè)試突然提了一個(gè)Bug給我,要求我將APP中某活動(dòng)頁(yè)面的UI界面要根據(jù)用戶在由此頁(yè)面跳轉(zhuǎn)的下個(gè)頁(yè)面操作,在返回時(shí)要實(shí)時(shí)更新。
在檢查代碼時(shí),發(fā)現(xiàn)我已經(jīng)對(duì)界面可變數(shù)據(jù)用LiveData去觀測(cè),但由于頁(yè)面變化后并沒(méi)有重新初始化UI,所以我放在初始化UI的請(qǐng)求根本沒(méi)有起效,如上圖所示例子,在進(jìn)入下一個(gè)頁(yè)面如若關(guān)閉開關(guān),返回時(shí)無(wú)法及時(shí)更新,于是我便想到了安卓科技與狠活Lifecycles,去監(jiān)聽onResume,在resume時(shí)用livedata去post數(shù)據(jù)。
正篇
說(shuō)了這么多但我們并沒(méi)有看到代碼,也即是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 } }
上面代碼用到了我們之前說(shuō)的ViewModel,與之前不同的是,我們?yōu)樗某蓡T變量添加了LiveData,而且通過(guò)_counter設(shè)置私有變量的形式對(duì)外部不可見,使LiveData就不可變了,這樣就能在非ViewModel中只能觀察LiveData數(shù)據(jù)變化,而不能給LiveData設(shè)置數(shù)據(jù)。
為什么要這樣做呢?這就不得不提一下上節(jié)我們的ViewModel生命周期問(wèn)題,它是長(zhǎng)與Activity的,這就可能導(dǎo)致Activity的實(shí)例傳給ViewModel,而Activity無(wú)法釋放造成內(nèi)存泄漏,我們是絕對(duì)不能那樣寫的。
而LiveData可以包含任何類型數(shù)據(jù),還能在數(shù)據(jù)變化時(shí)候通知給觀察者,這樣就能在數(shù)據(jù)變化時(shí)主動(dòng)去通知Activity。
接下來(lái)我們?cè)賮?lái)看看上篇文章中寫成的計(jì)數(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) } }
我們通過(guò)對(duì)LiveData的counter實(shí)例observe觀察從而改變了計(jì)數(shù)器,效果如下:
我們可以看到,該計(jì)數(shù)器效果沒(méi)有變化,但是實(shí)際上我們已經(jīng)將ui數(shù)據(jù)的改變通過(guò)ViewModel去實(shí)現(xiàn),這樣的代碼更科學(xué)也更合理,而且不用擔(dān)心ViewModel內(nèi)部會(huì)不會(huì)開啟線程執(zhí)行耗時(shí)邏輯。
但切記:如果在子線程給LiveData設(shè)置數(shù)據(jù),一定得調(diào)用postValue()方法,而不能使用setValue()方法,否則會(huì)導(dǎo)致異常崩潰。
結(jié)語(yǔ)
LiveData應(yīng)付正常的情況足夠了,但工作還是出現(xiàn)了Bug,畢竟需要我們手動(dòng)去獲取value,所以本篇LiveData知識(shí)部分準(zhǔn)備完成,下一篇我們將帶大家去看看Leftcycles是如何亡羊補(bǔ)牢,力挽狂瀾。
以上就是Android Jetpack 狠活Lifecycles與LiveData使用詳解的詳細(xì)內(nèi)容,更多關(guān)于Jetpack Lifecycles LiveData的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Android?Jetpack?組件LiveData源碼解析
- Android Jetpack組件庫(kù)LiveData源碼深入探究
- Android Jetpack組件支持庫(kù)DataBinding與ViewModel與LiveData及Room詳解
- Android開發(fā)Jetpack組件ViewModel與LiveData使用講解
- Android開發(fā)Jetpack組件LiveData使用講解
- Android?Jetpack庫(kù)剖析之LiveData組件篇
- 詳解Android JetPack之LiveData的工作原理
- Android Jetpack組件中LiveData的優(yōu)劣
相關(guān)文章
Android 三種延遲操作的實(shí)現(xiàn)方法
這篇文章主要介紹了Android 延遲操作的實(shí)現(xiàn)方法的相關(guān)資料,這里提供了三種實(shí)現(xiàn)方法,希望能幫助到大家,需要的朋友可以參考下2017-08-08Android實(shí)現(xiàn)IM多人員組合的群組頭像
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)IM多人員組合的群組頭像,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10Android簡(jiǎn)單實(shí)現(xiàn)計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了Android簡(jiǎn)單實(shí)現(xiàn)計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08View事件分發(fā)原理和ViewPager+ListView嵌套滑動(dòng)沖突
這篇文章主要介紹了View事件分發(fā)原理和ViewPager+ListView嵌套滑動(dòng)沖突,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià),需要的小伙伴可以參考一下2022-05-05android實(shí)現(xiàn)簡(jiǎn)單音樂(lè)播放器
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)簡(jiǎn)單音樂(lè)播放器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12Android實(shí)現(xiàn)手機(jī)聯(lián)系人分欄效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)手機(jī)聯(lián)系人分欄效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Android 圖文詳解Binder進(jìn)程通信底層原理
Android系統(tǒng)中,多進(jìn)程間的通信都是依賴于底層Binder IPC機(jī)制,Binder機(jī)制是一種RPC方案。例如:當(dāng)進(jìn)程A中的Activity與進(jìn)程B中的Service通信時(shí),就使用了binder機(jī)制2021-10-10Android自定義View實(shí)現(xiàn)水平帶數(shù)字百分比進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)水平帶數(shù)字百分比進(jìn)度條,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12