Kotlin入坑指南
帶你走進(jìn)Android Jetpack組件庫
Jetpack使用(一)之 Lifecycles 篇
Jetpack使用(二)之 LiveData 篇
LiveData介紹
LiveData 是一種可觀察的數(shù)據(jù)存儲器類。與常規(guī)的可觀察類不同,LiveData 具有生命周期感知能力,意指它遵循其他應(yīng)用組件(如 Activity、Fragment 或 Service)的生命周期。這種感知能力可確保 LiveData 僅更新處于活躍生命周期狀態(tài)的應(yīng)用組件觀察者。
LiveData 是一種可觀察的數(shù)據(jù)存儲器類。
等等,這個介紹好像似曾相識?對,前面說數(shù)據(jù)綁定的時候就有一個可觀察的數(shù)據(jù)對象ObservableField。那兩者有什么區(qū)別呢?
- LiveData 具有生命周期感知能力,可以感知到Activity等的生命周期。這樣有什么好處呢?很常見的一點(diǎn)就是可以減少內(nèi)存泄漏和崩潰情況了呀,想想以前你的項(xiàng)目中針對網(wǎng)絡(luò)接口返回數(shù)據(jù)的時候都要判斷當(dāng)前界面是否銷毀,現(xiàn)在LiveData就幫你解決了這個問題。
具體為什么能解決崩潰和泄漏問題呢?
- 不會發(fā)生內(nèi)存泄漏
觀察者會綁定到 Lifecycle 對象,并在其關(guān)聯(lián)的生命周期遭到銷毀后進(jìn)行自我清理。 - 不會因 Activity 停止而導(dǎo)致崩潰
如果觀察者的生命周期處于非活躍狀態(tài)(如返回棧中的 Activity),則它不會接收任何 LiveData 事件。 - 自動判斷生命周期并回調(diào)方法
如果觀察者的生命周期處于 STARTED 或 RESUMED狀態(tài),則 LiveData 會認(rèn)為該觀察者處于活躍狀態(tài),就會調(diào)用onActive方法,否則,如果 LiveData 對象沒有任何活躍觀察者時,會調(diào)用 onInactive()方法。
- LiveData更新數(shù)據(jù)更靈活,不一定是改變數(shù)據(jù),而是調(diào)用方法(postValue或者setValue)的方式進(jìn)行UI更新或者其他操作。
好了,還是舉個??更直觀的看看吧:
//導(dǎo)入庫:
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0"
class StockLiveData(symbol: String) : LiveData<BigDecimal>() {
private val stockManager = StockManager(symbol)
private val listener = { price: BigDecimal ->
value = price
}
override fun onActive() {
stockManager.requestPriceUpdates(listener)
}
override fun onInactive() {
stockManager.removeUpdates(listener)
}
}
public class MyFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val myPriceListener: LiveData<BigDecimal> = StockLiveData("")
myPriceListener.observe(this, Observer<BigDecimal> { price: BigDecimal? ->
// 監(jiān)聽livedata的數(shù)據(jù)變化,如果調(diào)用了setValue或者postValue會調(diào)用該onChanged方法
//更新UI數(shù)據(jù)或者其他處理
})
}
}
這是一個股票數(shù)據(jù)對象,StockManager為股票管理器,如果該對象有活躍觀察者時,就去監(jiān)聽股票市場的情況,如果沒有活躍觀察者時,就可以斷開監(jiān)聽。
當(dāng)監(jiān)聽到股票信息變化,該股票數(shù)據(jù)對象就會通過setValue方法進(jìn)行數(shù)據(jù)更新,反應(yīng)到觀察者的onChanged方法。這里要注意的是setValue方法只能在主線程調(diào)用,而postValue則是在其他線程調(diào)用。
當(dāng)Fragment這個觀察者生命周期發(fā)生變化時,LiveData就會移除這個觀察者,不再發(fā)送消息,所以也就避免崩潰問題。
官方文檔